我在爱尔兰的 Azure 中有一个解决方案。我住在丹麦。
将我所有的时间和日期保存universal = DateTime.Now.ToUniversalTime()在我在爱尔兰的数据库中是否正确?
当我需要丹麦时间时,我不能:universal.ToLocalTime()因为我仍在爱尔兰的服务器上。相反,我可以写:
danish = TimeZoneInfo.ConvertTimeFromUtc(universal, TimeZoneInfo.FindSystemTimeZoneById("Romance Standard Time"));
Run Code Online (Sandbox Code Playgroud)
但我认为这是很长的路要走。
备选方案 1:在我保存在爱尔兰的数据库之前,我将日期转换为丹麦语。备选方案 2:丹麦和爱尔兰之间有一个时区,所以我可以:danish = dateTime.AddHours(1),但也许它会在夏令时和冬令时出错。
一些东西:
写入没有任何问题DateTime.Now.ToUniversalTime(),但要了解在获取当前 UTC 时间,转换为本地时间,然后转换回 UTC 的幕后。因此,简单地调用DateTime.UtcNow以直接获取 UTC 时间而不进行转换既更短又更有效。
运行代码的服务器无关(或应该无关)。此外,无论如何,所有 Azure 实例的本地时区都设置为 UTC,因此您不会看到爱尔兰本地时区的任何影响。
是的,"Romance Standard Time"是丹麦当地时间的正确 Windows 标识符。如果您在非 Windows 平台上运行,则应"Europe/Copenhagen"改用。如果您正在为多平台使用而编写,请"Europe/Copenhagen"与我的TimeZoneConverter 库一起使用。
如果您只想编写更短的代码,您可以执行以下操作:
DateTime danish = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(universal, "Romance Standard Time");
Run Code Online (Sandbox Code Playgroud)
我说可能,因为只有当DateTime您的universal变量中的Kind属性设置为 时,这才是正确的DateTimeKind.Utc。如果您之前使用 进行了设置DateTime.SpecifyKind,那么这将起作用。另一方面,如果您刚刚从数据库中检索到此值,则默认情况下Kind将通过DateTimeKind.Unspecified. 关键的区别在于,ConvertTimeFromUtc将DateTimeKind.Unspecified其视为真实DateTimeKind.Utc,而ConvertTimeBySystemTimeZoneId将DateTimeKind.Unspecified其视为真实DateTimeKind.Local。
换句话说,如果您不Kind明确设置时间,它将从当地时间转换为丹麦时间。 但是,由于 Azure 将其本地时区作为 UTC 运行,因此您会得到相同的结果。只是在其他地方运行时可能会得到不同的结果。
您可能会考虑使用DateTimeOffset代替DateTime. 这通常会导致更清晰的代码和更少的错误。(DateTimeKind不与 一起使用DateTimeOffset。) 当然,这取决于您使用此数据的确切目的,但通常这是一个好主意。
关于你提出的替代方案,我不建议。你的原始代码更好。我对每个的想法:
备选方案 1:在我保存在爱尔兰的数据库之前,我将日期转换为丹麦语。
这取决于你代表什么。
如果这是一个独特的时间点(发生某事的时间,通常是过去) - 那么您应该将其保留为 UTC。这允许正确转换到任何时区。
另一方面,如果您表示某事预定发生的时间(未来),那么通常最重要的是当地时间。这对于具有 DST 的时区中的重复事件或可能不稳定的时区中的事件(政府频繁进行临时更改)尤其重要。
备选方案 2:丹麦和爱尔兰之间有一个时区,所以我可以:
danish = dateTime.AddHours(1),但也许它可能会在夏季和冬季时间出现错误。
您不应增加或减少时间来调整时区。毕竟 - 你不是在谈论未来一个小时或过去一个小时的不同时间点。
此外,丹麦和爱尔兰今天可能很相似,但这并不意味着它们一直都是这样,也不意味着它们将来一定会保持这种状态。爱尔兰有不同的时区标识符("GMT Standard Time"在 Windows 上,"Europe/Dublin"在其他平台上)。
| 归档时间: |
|
| 查看次数: |
862 次 |
| 最近记录: |