当前位置: 首页 > 编程语言 > C#

使用DateTime结构解析ISO8601日期-时间分享

时间:2023-04-10 11:38:49 C#

使用DateTime结构解析ISO8601日期/时间我正在尝试使用.NET的DateTime结构来解析ISO8601格式的日期/时间字符串。为了完全解决问题,我将使用.NET和JavaScript来执行测试。我目前在英国(BST,UTC+01:00)。我对ISO8601的理解是:考虑以下ISO8601日期/时间格式字符串:“1987-01-05T08:45:30.500+0100”在我看来,这个字符串表示本地时间“08:45:30”,UTC时间是“07:45:30”当前时区测试(.NET)DateTimenow=DateTime.Now;Console.WriteLine(now.ToLocalTime());//27/08/201312:02:43控制台。WriteLine(now.ToUniversalTime());//27/08/201311:02:43当前时区测试(JavaScript)varnow=newDate(Date.now());现在.toString();//2013年8月27日星期二12:03:46GMT+0100(格林威治标准时间夏令时)now.toUTCString();//星期二,2013年8月27日11:03:46GMT除了两个示例之间的轻微(分钟/秒)差异外,它们返回的是我对英国夏令时(UTC+01:00)的预期。分/秒差异是因为我无法同时运行.NET测试和JavaScript测试。所以现在让我们使用我的ISO8601日期/时间格式的字符串:(dt.ToLocalTime());//1987年5月1日07:45:30Console.WriteLine(dt.ToUniversalTime());//05/01/198707:45:30解析ISO8601格式字符串(JavaScript)vardt=newDate("1987-01-05T08:45:30.500+0100");dt.toString();//1987年1月5日星期一07:45:30GMT+0000(GMT标准时间)dt.toUTCString();//Mon,05Jan198707:45:30GMT这似乎与显示日期/时间“现在”的示例一致。为什么这显示我在英国夏令时间(UTC+00:00),而“现在”示例显示它在英国夏令时间(UTC+01:00)?如果我更改我的时区设置,我会按预期获得本地/世界时间,但如果我将它们设置为我当前的时区/时区,这似乎会产生不一致的结果。编辑:简而言之,当我尝试解析字符串时,.NET和JavaScript似乎都忽略了夏令时/BST(UTC+01:00)。结果在冬天是正确的,当我实际更改时区时也是正确的……但现在这在我在英国测试的“任何”机器上都不正确。英国在夏季(8月27日,示例中为“现在”)使用夏令时(时钟提前一小时),但在冬季(1月5日,来自解析“1987-01-05T08:45”):30.500+0100″).实际上,在冬天,英国使用UTC。您的机器似乎有英国的TimeZoneInfo。您可以使用TimeZoneInfo.Local.DisplayName(自.NET3.5起)或TimeZone.CurrentTimeZone.StandardName(旧)进行检查。您可以使用dt.IsDaylightSavingTime()检查。奖励:我的回答只是关于.NET(但也许同样适用于JavaScript?)。您提供的示例完全符合预期。1987年1月的日期和时间将转换为您当地的时区,据说是英国时区,而1987年1月,英国自冬季以来一直处于+0000。您提供的时间字符串带有+0100标记(好像来自德国或英国以东一小时车程的其他国家),这在解析字符串时被识别。1987年夏季的日期将正确转换为不同的日期,因为在1987年夏季,英国(以及所有欧洲经济共同体)实行夏令时(夏令时)。摘要:在解释时间时考虑偏移指示符或区域说明符+0100。这将在您的计算机上转换为英国时间。如果要转换为UTC而不是计算机的本地时间,请将重载与DateTimeStyles枚举一起使用并包括标志DateTimeStyles.AdjustToUniversal。如果您需要更好地表示时间和绝对时区值,请考虑使用结构DateTimeOffset而不是DateTime。您还可以考虑NODA时间而不是.NET类型。ToLocalTime和ToUniversalTime确实考虑了夏令时并且做得很好。至少在.Net中,JavascriptDate对象是有缺陷的,我建议在js中使用moment.js和moment-timezone.js进行转换。这是我的单元测试和结果:varnow=DateTime.Now;Console.WriteLine(now.ToLocalTime());Console.WriteLine(now.ToUniversalTime());//测试1时区UTC+1伦敦等。//当前日期7月20日=BST/*07/20/201501:06:4307/20/201500:06:43*///将日期设置为英国冬季时间1月20日/*01/20/201501:07:5501/20/201501:07:55*/为了在.Net中实现上述结果,您需要a)将时区设置为UTC+2b)ToLocalTime()失败,已修复,因为MSDN在转换日期时提到了XP上的错误。最后DateTime.Now返回本地时间,因此使用DateTime.Now.ToLocalTime()有点多余,您可能会得到意想不到的结果。以上就是C#学习教程:使用DateTime结构解析ISO8601日期/时间分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: