为了显示目的,我试图通过时区转换将给定的DateTime转换为NodaTime。即使有三次不同的尝试,我也无法让NodaTime给出预期的结果。下面是一些示例代码(给定DateTime dt):
//option 1
NodaTime.DateTimeZone zone = NodaTime.DateTimeZoneProviders.Tzdb ["Africa/Johannesburg"];
NodaTime.LocalDateTime localDateTime = NodaTime.LocalDateTime.FromDateTime(dt);
NodaTime.ZonedDateTime zonedDateTime = localDateTime.InZoneStrictly(zone);
string str = zonedDateTime.ToString("H:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
Debug.LogFormat ("TimeZone: {0}", zone);
Debug.LogFormat ("Option 1: {0} local: {1} zoned: {2}", str, localDateTime, zonedDateTime);
//option 2
NodaTime.Instant instant = NodaTime.Instant.FromDateTimeUtc (dt.ToUniversalTime ());
zonedDateTime = instant.InZone(zone);
str = zonedDateTime.ToString("H:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
Debug.LogFormat ("Option 2: {0} instant: {1} zoned: {2}", str, instant, zonedDateTime);
//option 3
DateTime epochStart = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
long epochSeconds = (long)(dt.ToUniversalTime()- epochStart).TotalSeconds;
instant = NodaTime.Instant.FromSecondsSinceUnixEpoch (epochSeconds);
zonedDateTime = instant.InZone(zone);
str = zonedDateTime.ToString("H:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
Debug.LogFormat ("Option 3: {0} epoch: {1} instant: {2} zoned: {3}", str, epochSeconds, instant, zonedDateTime);在南非以外的其他国家(比如我坐在那里的以色列)运行这个选项会为选项2和3提供正确的时间。当我在南非自己运行它时,它就不起作用了,时间缩短了一个小时。这是示例输出(正确的是"17:55“值,例如”我的计算机“的选项2和3)。当然,罪魁祸首可能是时区或夏时制差异,而不是实际的地理位置:
TimeZone:非洲/约翰内斯堡 备选案文1: 18:55:41地方性: 09/01/2016 18:55:41分区: 2016-09-01T18:55:41非洲/约翰内斯堡(+02) 备选案文2: 17:55:41即时: 2016-09-01T15:55:41Z划区: 2016-09-01T17:55:41非洲/约翰内斯堡(+02) 选项3: 17:55:41划时代: 1472745341瞬间: 2016-09-01T15:55:41Z分区: 2016-09-01T17:55:41非洲/约翰内斯堡(+02) 备选案文1: 18:55:41地方:2016年1月9日6:55:41下午划区: 2016-09-01T18:55:41非洲/约翰内斯堡(+02) 备选案文2: 18:55:41即时: 2016-09-01T16:55:41Z分区: 2016-09-01T18:55:41非洲/约翰内斯堡(+02) 选项3: 18:55:41划时代: 1472748941瞬间: 2016-09-01T16:55:41Z分区: 2016-09-01T18:55:41非洲/约翰内斯堡(+02)
无论当前位置如何,如何确保我的DateTime -> NodaTime输出是一致的?
发布于 2016-09-06 16:41:46
我将集中回答你问题的这一部分:
无论当前位置如何,如何确保我的DateTime -> NodaTime输出是一致的?
代码中有几个地方,您可以在一个.ToUniversalTime()对象上调用DateTime。当您这样做时,操作取决于分配给对象的DateTimeKind属性的Kind值。每MSDN文档

因此,只要Kind不是DateTimeKind.Utc,则输入值被解释为位于本地时区,因此,对UTC的转换会受到运行它的计算机上的任何本地时区的影响,从而导致不一致的输出。
如果不希望代码在两台计算机之间的本地时区不同时给出不同的结果,则不应使用此方法。这就是为什么代码中的选项2和选项3给出了不同的结果。
至于选项1,你到底想做什么还不清楚。您断言输入dt位于Africa/Johannesburg时区,但从不要求任何类型的转换。您只是在释放与传入的相同的本地值。如果你打算从世界协调时转换到南非,反之亦然,那么你需要在问题中更清楚地解释这一点。事实上,我不知道你到底想要做什么。
https://stackoverflow.com/questions/39314926
复制相似问题