我意识到有很多有关解析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
都不正确!
我尝试了与其他线程不同的格式,例如:
我还尝试使用DateTimeOffset.Parse并将区域性更改为我的(zh-cn)
他们都给我相同的结果。
我在做什么错?如何获取日期时间与从API获取的日期值相同的UTC时间?
答案 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
解析的时区说明符。其他z
,zz
和zzz
则用于DateTimeOffset
解析。+0000
或Z
),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
类型,则可以避免麻烦和困惑。在这种情况下,它是优越的,因此您不必担心DateTimeOffset
或DateTimeKind
。