在C#中将UTC日期/时间字符串转换为本地时间

5

我需要将字符串"Fri Sep 11 00:00:00 GMT+04:00 2020"转换为DateTime对象11.09.2011

当我使用

DateTime result;
DateTime.TryParseExact(MyString, "ddd MMM dd HH:mm:ss 'GMT'zzz yyyy", 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out result);

result 等于 {2020年9月10日晚上11:00:00}

我该如何修改代码,以便日期组件为11.09.2011,而不是10.09.2011(我只需要日期,不关心时间)?

2个回答

7
将其解析为DateTimeOffset,因为你已经有了偏移量。根据你正在使用的“zz”说明符的文档

对于DateTime值,“zz”自定义格式说明符表示本地操作系统时区与UTC之间的带符号偏移量,以小时为单位。它不反映实例的DateTimeKind属性的值。因此,建议不要将“zz”格式说明符与DateTime值一起使用。

所以你最终会得到:

DateTimeOffset result;
bool success = DateTimeOffset.TryParseExact
         (text, "ddd MMM dd HH:mm:ss 'GMT'zzz yyyy", 
          CultureInfo.InvariantCulture, DateTimeStyles.None, out result);

从那里,您可以获取DateTime部分,其将是9月11日午夜。

如果你只想要日期,你可以使用我的Noda Time项目来创建一个LocalDate

LocalDate = OffsetDateTime.FromDateTimeOffset(result).LocalDateTime.Date;

我很乐意建议直接解析为OffsetDateTime,但我们目前还没有支持该功能。我们希望在1.2版本中包含它。


4

C#没有纯粹的Date类型。
如果您不关心时间,可以忽略DateTime中的时间部分。

如果您希望时间始终为午夜,请使用.Date属性,它将返回一个具有相同日期但在午夜的DateTime


问题在于我得到了10.09.2011(错误的日期),而不是11.09.2011(正确的日期)。也就是说,我需要一个提示,告诉我如何修改代码,使得result等于11.09.2011...(其中...是时间,对我来说不重要)。 - Glory to Russia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接