将在日期创建的Twitter解析为UTC

时间:2018-08-28 16:30:45

标签: c# datetime twitter timezone datetime-format

我意识到有很多有关解析Twitter日期的线程,但是我遇到了一个特殊的问题,并且无法找到任何特定于此的线程。

我正在检索该帖子:https://twitter.com/bodegamcallen/status/1033757489567805440

其创建日期为 2018年8月26日上午9:46

在api中创建的日期是:“ Sun Aug 26 16:46:06 +0000 2018”

有意义的是下午16:46(2:46 pm)UTC是中部时间9:46(-500)。

但是,我正在使用以下代码对此进行解析:

statusModel.DatePosted = DateTime.ParseExact(
    this.created_at, "ddd MMM dd HH:mm:ss zzzz yyyy", 
    CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.AssumeUniversal);

我没有得到上面显示的所需UTC时间,而是得到了: 2018/8/26下午4:46:06

如果我将DateTimeStyle更改为None或AssumeLocal,则会得到以下信息: 2018/8/26 11:46:06

都不正确!

我尝试了与其他线程不同的格式,例如:

  • “ ddd MMM dd HH:mm:ss K yyyy”
  • “ ddd MMM dd HH:mm:ss Z yyyy”
  • “ ddd MMM dd HH:mm:ss zzz yyyy”
  • “ ddd MMM dd HH:mm:ss + ffff yyyy”

我还尝试使用DateTimeOffset.Parse并将区域性更改为我的(zh-cn)

他们都给我相同的结果。

我在做什么错?如何获取日期时间与从API获取的日期值相同的UTC时间?

2 个答案:

答案 0 :(得分:0)

啊哈!事实证明,我的Twitter帐户设置被配置为太平洋时间,而不是中央时间,这将导致两个小时的差异。

我已按照以下说明更改了帐户的时区设置:https://help.twitter.com/en/managing-your-account/how-to-change-time-zone-settings

更改为中央时间后,API数据正确无误!

希望这对其他人有帮助。时区,无人吗?

答案 1 :(得分:0)

几件事:

  • zzzz不是有效的说明符。如果不确定,请始终检查these docs
  • K是唯一适合DateTime解析的时区说明符。其他zzzzzz则用于DateTimeOffset解析。
  • 当输入字符串中有任何偏移量或时区信息时(即使是+0000Z),DateTime.Parse和{{1} }会默认假设您希望输出种类为DateTime.ParseExact,并且希望将值调整为local,无论输入字符串中的值是什么。如果不确定输出DateTimeKind.Local是否工作正常,请检查它。如果您要使用UTC,则应传递.Kind
  • 您不需要传递DateTimeStyles.AdjustToUniversal,因为输入字符串中存在时区信息。
  • 这不是无效的,但是您不需要传递DateTimeStyles.AssumeUniversal。通过CultureInfo.InvariantCulture.DateTimeFormat就足够了,而且更为常见。

将所有内容放在一起,您的代码应为:

CultureInfo.InvariantCulture

当然,如果将statusModel.DatePosted = DateTime.ParseExact( this.created_at, "ddd MMM dd HH:mm:ss K yyyy", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal); 更改为DatePosted类型,则可以避免麻烦和困惑。在这种情况下,它是优越的,因此您不必担心DateTimeOffsetDateTimeKind