- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 .NET 的 DateTime 结构解析 ISO8601 格式的日期/时间字符串。
为了让我全面了解问题,我将使用 .NET 和 JavaScript 执行测试。我目前在英国(英国夏令时,UTC+01:00)。
我对ISO8601的理解是:
考虑以下 ISO8601 日期/时间格式字符串:
"1987-01-05T08:45:30.500+0100"
根据我上面的观点,这个字符串表示本地时间“08:45:30”和 UTC 时间“07:45:30”
当前时区测试 (.NET)
DateTime now = DateTime.Now;
Console.WriteLine(now.ToLocalTime()); // 27/08/2013 12:02:43
Console.WriteLine(now.ToUniversalTime()); // 27/08/2013 11:02:43
当前时区测试(JavaScript)
var now = new Date(Date.now());
now.toString(); // Tue Aug 27 2013 12:03:46 GMT+0100 (GMT Daylight Time)
now.toUTCString(); // Tue, 27 Aug 2013 11:03:46 GMT
除了两个示例之间的微小(分钟/秒)差异外,它们返回的结果与我对英国夏令时间 (UTC+01:00) 的预期完全相同。 分/秒差异是因为我无法完全同时运行 .NET 测试和 JavaScript 测试。
现在让我们使用我的 ISO8601 日期/时间格式的字符串:
解析 ISO8601 格式字符串 (.NET)
DateTime dt = DateTime.Parse("1987-01-05T08:45:30.500+0100");
Console.WriteLine(dt.ToLocalTime()); // 05/01/1987 07:45:30
Console.WriteLine(dt.ToUniversalTime()); // 05/01/1987 07:45:30
解析 ISO8601 格式字符串(JavaScript)
var dt = new Date("1987-01-05T08:45:30.500+0100");
dt.toString(); // Mon Jan 05 1987 07:45:30 GMT+0000 (GMT Standard Time)
dt.toUTCString(); //Mon, 05 Jan 1987 07:45:30 GMT
这似乎与显示日期/时间“now”的示例不一致。为什么我在英国冬令时 (UTC+00:00) 显示的是英国夏令时 (UTC+01:00) 而“现在”示例?
如果我更改我的时区设置,我会得到本地/世界时间的预期结果,但如果它们设置为我当前的时区/时区,这似乎会产生不一致的结果。
编辑:简而言之,当我尝试解析字符串时,就好像 .NET 和 JavaScript 都忽略了夏令时/英国夏令时 (UTC+01:00)。结果在冬天是正确的,而且当我物理上改变我的时区时也是正确的......但就目前而言,这在我在英国测试过的“任何”机器上是不正确的。
最佳答案
英国在夏季(8 月 27 日,示例中的“现在”)使用夏令时(将时钟提前一小时),但在冬季不使用(1 月 5 日,来自您对“1987-01-05T08:45:30.500+0100”的解析)。
实际上,英国在冬天使用 UTC。你的机器似乎有英国的 TimeZoneInfo
。您可以使用 TimeZoneInfo.Local.DisplayName
(自 .NET 3.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 类型。
关于c# - 使用 DateTime 结构解析 ISO8601 日期/时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18454631/
我想知道是否可以通过 ISO 8583 做一个完整的声明(在一个日期范围之间),我看到 ATM 可以做完整的声明并且想知道他们使用什么方法。我知道余额查询和迷你报表可以在超过 8583 的 POS 设
我一直在尝试通过 7zip 和 WinRar 提取 ISO 镜像。 这是我使用的命令行: 7z x -y "%Isocontents%\ISO.iso" -o%Newfolder% WinRar.ex
我正在将 ICU 集成到一些内部软件中。我希望能够获取诸如“en_US”之类的字符串并为其获取脚本名称“Latin”。 (虽然最终我实际上想要一个 ICU ScriptCode。) 我尝试使用 ICU
我的数据位于一个数据框中,其结构如下: df2 <- data.frame(Year = c("2007"), Week = c(1:12), Measurement = c(rnorm(12, me
我需要计算一周分配到的年份。例如,2003 年 12 月 29 日被指定为 2004 年的第一周(我认为这仅适用于欧洲)。您可以使用以下代码来查看: SELECT DATEPART(isowk, '2
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我有一个文件。在 Python 中,我想占用它的创建时间,并将其转换为 ISO time (ISO 8601) string 同时保留它是在 Eastern Time Zone 中创建的事实。 (美国
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我在二维网格上有两个标量场。我想为第一个标量场绘制一条等值线,并根据第二个标量场设置其不透明度。 我从 this SO answer 开始尝试使用 mayavi但我无法从 3D 切换到 2D。 下面是
假设您声明两个同构 showing :: (Read a, Show a) => Iso' String a showing = iso read show reading :: (Read a, S
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines准则。它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,
假设有一个两个字符的String,它应该代表ISO 639国家或语言名称。 你知道,Locale类有两个函数 getISOLanguages和 getISOCountries分别返回包含所有 ISO
实体中的值是否可以自由嵌入到 ISO 10303-21 格式的文件中? 在我看到的所有由 CAD 程序生成的示例中,length_measure 都嵌入在uncertainty_measure_wit
是否可以从原始 ISO 自动创建用于操作系统安装的 Vagrant .box 文件? 对我来说,Vagrant 提供的虚拟机上操作系统安装和配置的端到端自动化存在巨大差距。 当然,VagrantBox
有没有办法实现这样的格式: 2003-09-25T14:00:00.000+1000 or 2003-09-25T14:00:00.000+1100 要这样转换 2003-09-25T14:00:00
我正在使用: @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) @JsonFormat( pattern = "MM-dd-yyyy" ) private
我需要将 iso-3166-1/iso-3166-2 代码转换为经度/纬度 例子: 输入:“美国”,输出:(37.09024, -95.71289100000001)。 输入“VE-O”,输出:(10
我想转换 POSIX 语言环境名称,例如 en_US、de_DEISO-639-1 和 ISO-3166 代码到 Windows English_United States、German_German
我在 MS Access 上有一个数据库,我通过调用 PDO 和 odbc 驱动程序将其与 PHP 一起使用。我的数据库中有法语、丹麦语和波兰语单词。法语和丹麦语没问题,但波兰语字符没办法,我只得到“
我是一名优秀的程序员,十分优秀!