为什么 C# 没有检测到 1970/1/1 处于 BST 之下?

2023-12-12

我正在使用第 3 方 API,该 API 将一天中的时间值返回为日期时间值,并填写 1970 年 1 月 1 日作为日期部分。所以对于凌晨 5 点,它会返回类似的内容1969-12-31T21:03:00.000-08:00

问题是,如果用户使用伦敦时间,C# 无法应用 1970-01-01 的 BST 调整。 例如,1970-01-01 5AM在 UTC 中应该是1970-01-01 6AM在伦敦。查看转换

但是,C# 似乎没有应用此转换:

var utcTime = new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Utc);
var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var ukTime = TimeZoneInfo.ConvertTime(utcTime, britishZone);
Console.WriteLine(ukTime);

上面的代码仍然会打印 5AM。

但是,如果我将其设置为 BST 生效的较新日期(例如 2016 年 10 月 1 日),则相同的代码可以正确打印上午 6 点。

  1. 为什么它会这样?
  2. 我该如何解决这个问题?我们的应用程序需要跨任何时区工作(即硬编码时区不是一个选项 - 我们基本上使用 Windows 本地时区)。

当您使用TimeZoneInfoWindows 上使用系统时区的类("GMT Standard Time"在本例中),您需要从 Windows 操作系统获取时区数据,该数据存储在注册表中:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Windows 根本无法回溯那么远的历史数据。为了"GMT Standard Time",这是伦敦在 GMT 和 BST 之间交替的时区,它只知道一组规则 - 当前有效的规则。它不知道之前的任何事情(最后一次改变是在 1996 年)。

请注意,根据 MicrosoftDST/TZ 支持政策,仅保证记录 2010 年以后的更改。 Windows 历史上有一些较旧的更改(例如美国 2007 年 DST 更改等),这些更改确实有效,但从全球角度来看,您可能无法在 2010 年之前的日期获得最佳结果。

为此,您需要完整实施IANA TZ 数据库,而在 .NET 中,实现此目的的最佳方法之一是使用野田时间图书馆。

您的代码,音译为野田时间:

var utcTime = Instant.FromUtc(1970, 1, 1, 5, 0, 0);
var britishZone = DateTimeZoneProviders.Tzdb["Europe/London"];
var ukTime = utcTime.InZone(britishZone);
Console.WriteLine(ukTime.ToDateTimeUnspecified()); // just for equivalent output

// Prints:  1/1/1970 6:00:00 AM

另请注意,如果您在 Linux 或 OSX 上运行 .NET Core,那么时区确实是 IANA 时区,因此您的原始代码只需使用 IANA 标识符即可工作

var britishZone = TimeZoneInfo.FindSystemTimeZoneById("Europe/London");

也可以看看时区标签 wiki.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C# 没有检测到 1970/1/1 处于 BST 之下? 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 将文件(如对象)保存到 s3 时出现错误:Unicode 对象必须在散列之前进行编码

    这是我的代码 import boto3 import pandas as pd import requests from io import StringIO campaign buffer StringIO r requests get
  • 将 css 放置在 codeigniter 视图中

    我是 codeigniter 的新手 我制作了一个简单的控制器来加载三个视图 页眉 正文和页脚 我的标头包含指向多个具有相对路径的 javascript 和 CSS 的链接 我将所有与文件相关的 css 和 js 保留在视图文件夹中 问题是
  • 为什么同一自动化流程生成的 pdf 在不同机器上会有所不同?

    我有一个生成 pdf 的自动化流程然后我们通过批准测试将其与已知版本进行比较验证该管道中没有任何损坏 我标准化不匹配的字段例如创建 修改日期和时区 本地所有内容始终 100 匹配 然而由于某种原因 我们的构建服务器上生成的 pdf 是ver
  • unique() 用于多个变量

    我在 R 中有以下数据框 gt str df data frame 545227 obs of 15 variables ykod int 93 93 93 93 93 93 93 93 93 93 yad Factor w 42 leve
  • Safari 和 Chrome 中允许跨域请求吗?服务器响应与命令行参数

    我正在尝试在 Windows 上使用 Safari 发出跨域请求 我的 Safari 版本是 5 1 2 这是一个经典问题 我在很多地方读到 Chrome 和 Safari 允许跨域请求 只要服务器在响应中使用以下标头进行响应 Access
  • 在 UITextField 之外的任何地方触摸时关闭键盘

    我正在开发一个iPad应用程序 其中有大量UIViewControllers UITableViews 与细胞accessoryViews of UITextFields 等等等等 许多UIViewControllers出现在导航层次结构中
  • 访问 pandas DataFrame 中名为“class”的列时出现语法错误

    我有名为 dataset 的 pandas DataFrame 它包含一个名为 class 的列 当我执行以下行时 我得到 SyntaxError 无效语法 print Unique values in the Class column d
  • C#中如何杀死线程?

    我有一个线程打开 MyMessageAlert 类型的表单 该表单是一个弹出窗口 当我调用它时会打开它 它有一个计时器 在 30 秒后调用 CloseWindow 方法 m messagAlert new MyMessageAlert Pa
  • 这个配置规格足够好吗?

    我更喜欢 UCM 而不是 Base CC 谁能告诉我这个配置规范是否好 我对最后一行有一些疑问 没有的话可以吗element main LATEST 以下是开发者的要求 我希望他们所有的改变 main nz plusOne分支 即使他们从
  • 如何使用 sed 匹配后面不跟单词的字符串

    我需要删除由连字符后跟空格组成的所有字符串 但前提是空格后面没有单词 og 示例文件 Kultur og idrettsavdelinga skapar nyska pande kunst og utvik lar samfunnet 我尝
  • 为什么这个随机数生成器不是随机的? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么我的随机数生成器在 C 中不是随机的 随机数生成器没有按我计划的方式工作 C 我有这个方法来计算随机值 private double getMetrics SourceFile sf Rando
  • C 中的堆大小限制

    我对 C 程序的程序执行布局图中的堆有疑问 我知道所有动态分配的内存都是在动态增长的堆中分配的 但我想知道 C 程序的最大堆大小是多少 我只是附加一个示例 C 程序 这里我尝试为字符串分配 1GB 内存 甚至执行 memset includ
  • 在 VSTS 中显示代码分析警告

    I ve 设置静态代码分析在我的 Visual Studio Team Services 构建上 我正在为我的解决方案使用 MSBuild 构建步骤 在构建日志中 它显示了 999 多行以 warning 2017 11 09T13 52
  • MongoDB:与 ASP.NET MVC 应用程序连接

    我创建了一个 ASP NET MVC 5 应用程序 并将其托管在 IIS 7 上 我现在想开始在该应用程序中使用 MongoDB 数据库 我已经成功运行了 MongoDB Windows 服务 但我现在不知道下一步是什么 Namely i
  • 零截距模型的 lm() 中的 R 平方

    我经营一家lm 在 R 中 这是总结的结果 Multiple R squared 0 8918 Adjusted R squared 0 8917 F statistic 9416 on 9 and 10283 DF p value lt
  • 通过 SAS 从 ORACLE DB 导入 blob

    对每个人来说都是一天中的好时光 上周我在工作中遇到了一个巨大的问题 这是交易 我需要通过SAS从ORACLE数据库下载excel文件 blob 我在用 第一步我需要从oracle获取数据 我使用的构造 blob文件近100kb proc s
  • ace.js 和 Angular 的主题和模式路径推断问题

    抱歉 不幸的是 这个问题没有提供太多细节 因为我不确定到底需要什么来解释这个问题 首先 我正在尝试使用ng2 ace editor in my Angular应用 但我的设置并不标准 详细信息在另一个相关问题中 应用程序找不到 js 文件
  • 对非对象调用成员函数 rowCount()

    我的查询有问题 我最近转向 PDO 这对我来说有点新鲜 现在我需要在查询中使用 JOIN 从另一个表获取数据 而不需要执行两次 问题是 我收到此错误 Call to a member function rowCount on a non o
  • HashMap 持有重复的键

    在尝试时HashMap 我注意到一些奇怪的事情 运行 4 个线程 每个线程尝试将 key value 的键值从 0 到 9999 值设为常量字符串 当所有线程都完成后 map size 返回的值大于 10 000 这怎么发生的 这是否意味着
  • 为什么 C# 没有检测到 1970/1/1 处于 BST 之下?

    我正在使用第 3 方 API 该 API 将一天中的时间值返回为日期时间值 并填写 1970 年 1 月 1 日作为日期部分 所以对于凌晨 5 点 它会返回类似的内容1969 12 31T21 03 00 000 08 00 问题是 如果用