【问题标题】:Convert string to DateTimeOffset ignoring time zones将字符串转换为 DateTimeOffset 忽略时区
【发布时间】:2018-10-28 17:32:11
【问题描述】:

我创建了一个string 扩展方法,它将特定的string 转换为DateTimeOffset。我执行了以下方法:

public static DateTimeOffset? ConvertToDateTimeOffset(this string text)
{
    DateTimeOffset date;

    if (DateTimeOffset.TryParse(text, out date))
    {
        return date;
    }
    else
    {
        return null;
    }
}

用这个字符串:

"2010-05-10".ConvertToDateTimeOffset()

我想得到以下结果:

{2010. 05. 10. 0:00:00 +00:00}

但是我的执行方法调用的实际结果是(请注意+02:00):

{2010. 05. 10. 0:00:00 +02:00}

我怎样才能消除这个时区问题

【问题讨论】:

  • if (DateTimeOffset.TryParse(text, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out date)) {...}

标签: c# timezone datetimeoffset


【解决方案1】:

如果您想要 UTC,而不是 本地时间,您必须使用 DateTimeStyles.AssumeUniversal 手动指定:

... 
if (DateTimeOffset.TryParse(text, 
                            CultureInfo.InvariantCulture,
                            DateTimeStyles.AssumeUniversal, 
                            out date)) {
  ...
}
...

您可以使用out var 简化实现(C# 7.0+):

public static DateTimeOffset? ConvertToDateTimeOffset2(this string text) {
  return DateTimeOffset.TryParse(text, 
                                 CultureInfo.InvariantCulture, 
                                 DateTimeStyles.AssumeUniversal, 
                                 out var date)
    ? date
    : (DateTimeOffset?) null;
}

【讨论】:

    【解决方案2】:

    检查这个link

    我相信你正在寻找

       DateTimeOffset.TryParse(text, null, DateTimeStyles.AssumeUniversal, out date);
    

    根据文档

    Indicates that, if the input parameter lacks an <Offset> element, the UTC offset (00:00) should be provided.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-30
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多