【问题标题】:Convert string to datetime UTC将字符串转换为日期时间 UTC
【发布时间】:2015-10-24 21:45:15
【问题描述】:

我有这个字符串“Sun Aug 02 2015 00:15:47 GMT+0000 (UTC)”

我创建了这么多日期时间格式“ddd MMM dd yyyy HH:mm:ss”

现在我不确定如何处理该日期时间字符串的结尾部分。 我不确定我拥有的字符串是可以轻松转换的 UTC 标准格式还是自定义格式。

不过,我想将该字符串 datetime 转换为 datetime 对象。

【问题讨论】:

  • 看看这个答案和 ParseExact 的使用。 stackoverflow.com/questions/919244/…
  • 只是这个字符串,还是一个例子?如果它变化,字符串 always 是否采用这种格式,并且总是以 "GMT+0000 (UTC)" 结尾,还是该部分变化?了解字符串的来源会有所帮助。
  • @MattJohnson 我正在使用第 3 方 api,并且每次都以该格式返回该日期时间字符串。

标签: c# date datetime


【解决方案1】:

我会考虑以下两种方法之一:

string str = "Sun Aug 02 2015 00:15:47 GMT+00:00 (UTC)";
str = str.Substring(0, str.IndexOf('(') - 1);
DateTime dt = DateTime.ParseExact(str, "ddd MMM dd yyyy HH:mm:ss 'GMT'K",
    CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

string str = "Sun Aug 02 2015 00:15:47 GMT+00:00 (UTC)";
str = str.Substring(0, str.IndexOf('(') - 1);
DateTimeOffset dto = DateTimeOffset.ParseExact(str, "ddd MMM dd yyyy HH:mm:ss 'GMT'K",
    CultureInfo.InvariantCulture);

在任一示例中,我们假设括号中的部分是不相关的。如果您的输入可能因不同时区而异,这可能很重要。

在第一个示例中,我们假设您希望输出始终是基于 UTC 的 DateTime。输入偏移量可能会有所不同,但输出将始终调整为协调世界时,并且将具有DateTimKind.Utc

在第二个示例中,我们假设您希望输出与输入中提供的内容完全匹配。为此,输出需要是DateTimeOffset 类型。否则,您将无法跟踪与 UTC 或您自己的本地时区不完全匹配的偏移量。

我更喜欢第二种选择。如果您需要DateTime,您始终可以通过调用生成的DateTimeOffset.DateTime.UtcDateTime.LocalDateTime 属性来获得。

【讨论】:

  • +1。这绝对是一个更好的方法。甚至 MSDN 也提到不建议将 z.. 格式与 DateTime 一起使用,因为它甚至不存储任何偏移值(或时区信息)。还有DateTimKind 问题。当您对 DateTime 执行某些操作(例如保存在数据库中等)时,Local 可能会模棱两可。
【解决方案2】:
string str = "Sun Aug 02 2015 00:15:47 GMT+0000 (UTC)";
var dt = DateTime.ParseExact(str, "ddd MMM dd yyyy HH:mm:ss \"GMT\"zzzz \"(UTC)\"", CultureInfo.InvariantCulture);

【讨论】:

  • "zzzz" 不是有效的格式说明符。此外,使用这种方法,结果将有 DateTimeKind.Local 而不是 DateTimeKind.Utc
  • @MattJohnson "zzzz" is not a valid format specifier 你认为我在测试之前发布了这个答案吗?另一方面,我不擅长 DateTime 的事情。或许加个.ToUniversalTime();就可以解决了。
  • 任何超过三个z 的都将被忽略,并被视为zzz。如果您不考虑DateTimeKind,上述代码仍然有效。如果您在此处查看类型,它将是 DateTimeKind.Local - 这可能是不希望的。
  • 是的,但是当您指定 zzzzz 时,它也可以正常工作 - 即使您在偏移量中有四个有效数字。仍然 - 无论哪种方式,结果都不正确,因为它的 .Kind 属性已关闭。看我的回答。
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 2021-04-19
  • 2011-06-13
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多