gpt4 book ai didi

c# - 使用野田时间在时区之间转换

转载 作者:可可西里 更新时间:2023-11-01 03:04:55 26 4
gpt4 key购买 nike

我目前正在努力确保我们的旧后端能够支持根据用户当前时区(或者更具体地说,偏移量)解析日期时间。我们的服务器采用东部标准时间,我们的大部分日期时间都来自那里。但是,对于处于其他时区的用户,在检索这些日期时间时需要转换为他们的时区(或在本例中为偏移量)。此外,在服务器上持久化之前,来自用户的日期时间必须转换为东部标准时间。鉴于我们正在开发的前端是基于 Web 的,我能够在几分钟内检索用户的偏移量并将该值传递到 header 中的服务层。我查看了 Noda Time,认为它是一个很棒的 AP​​I。它确实迫使我在更精细的问题上考虑时间,但我仍然不能 100% 确定我是否正确地使用了它。以下是我为上述转换编写的方法。我测试过它们,它们似乎有效。鉴于上述情况,这看起来像是对库的正确使用吗?我是否正确考虑了约会时间?

public static DateTime ConvertToUtcFromEasternTimeZone(DateTime easternDateTime)
{
NodaTime.DateTimeZone easternTimeZone = NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/New_York");
ZoneLocalMappingResolver customResolver = Resolvers.CreateMappingResolver(Resolvers.ReturnLater, Resolvers.ReturnStartOfIntervalAfter);
var easternLocalDateTime = LocalDateTime.FromDateTime(easternDateTime);
var easternZonedDateTime = easternTimeZone.ResolveLocal(easternLocalDateTime, customResolver);
return easternZonedDateTime.ToDateTimeUtc();
}

public static DateTime ConvertToEasternTimeZoneFromUtc(DateTime utcDateTime)
{
NodaTime.DateTimeZone easternTimeZone = NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("America/New_York");
NodaTime.DateTimeZone utcTimeZone = NodaTime.DateTimeZoneProviders.Tzdb.GetZoneOrNull("UTC");
ZoneLocalMappingResolver customResolver = Resolvers.CreateMappingResolver(Resolvers.ReturnLater, Resolvers.ReturnStartOfIntervalAfter);
var utcLocal = LocalDateTime.FromDateTime(utcDateTime);
var utcZonedDateTime = utcTimeZone.ResolveLocal(utcLocal, customResolver);
var easternZonedDateTime = utcZonedDateTime.ToInstant().InZone(easternTimeZone);
return easternZonedDateTime.ToDateTimeUnspecified();
}

public static DateTime ConvertToUtc(DateTime dateTime, int offsetInMinutes)
{
LocalDateTime localDateTime = LocalDateTime.FromDateTime(dateTime);
var convertedDateTime = localDateTime.PlusMinutes(offsetInMinutes).ToDateTimeUnspecified();
return convertedDateTime;
}

public static DateTime ConvertFromUtc(DateTime dateTime, int offsetInMinutes)
{
LocalDateTime localDateTime = LocalDateTime.FromDateTime(dateTime);
var convertedDateTime = localDateTime.PlusMinutes(-offsetInMinutes).ToDateTimeUnspecified();
return convertedDateTime;
}

这里的想法是,当我在 UTC 时间和数据库中的时区之间进行解析时,时区很重要。当我在客户端时间和 UTC 时间之间解决时,偏移很重要。

以后我们可以持久化UTC时间,这样会更容易。目前,此解决方案是权宜之计。

我们的想法是,我们将从...

客户端 -> UTC +/- 偏移量 -> UTC -> 东部时间 -> 数据库

数据库 -> 东部时间 -> UTC -> UTC +/- 偏移量 -> 客户端

最终...

客户端 -> UTC +/- 偏移量 -> UTC -> 数据库

数据库 -> UTC -> UTC +/- 偏移量 -> 客户端

最佳答案

你的第一个方法看起来不错,虽然我们不知道 customResolver 是什么。

你的第二种方法有点不对劲。我建议:

public static DateTime ConvertToEasternTimeZoneFromUtc(DateTime utcDateTime)
{
var easternTimeZone = DateTimeZoneProviders.Tzdb["America/New_York"];
return Instant.FromDateTimeUtc(utcDateTime)
.InZone(easternTimeZone)
.ToDateTimeUnspecified();
}

请注意,您无需在每个方法调用中查找东部时区 - 只需:

private static readonly DateTimeZone EasternTimeZone = 
DateTimeZoneProviders.Tzdb["America/New_York"];

...然后到处使用它。

您的第三种和第四种方法不是我认为的惯用方法 - 对于您应该使用的第三种方法:

public static DateTime ConvertToUtc(DateTime dateTime, int offsetInMinutes)
{
var offset = Offset.FromMinutes(offsetInMinutes);
var localDateTime = LocalDateTime.FromDateTime(dateTime);
return new OffsetDateTime(localDateTime, offset).ToInstant()
.ToDateTimeUtc();
}

第四种方法似乎有点棘手,因为我们没有提供我们应该使用 OffsetDateTime 进行转换的所有内容。您使用的代码可能没问题,但如果您可以使用 OffsetDateTime 肯定会更简洁。

编辑:我现在向 Instant 添加了一个方法,使第四个方法更清晰。它将成为 1.2.0 的一部分,您可以使用:

public static DateTime ConvertFromUtc(DateTime dateTime, int offsetInMinutes)
{
var offset = Offset.FromMinutes(offsetInMinutes);
var instant = Instant.FromDateTimeUtc(dateTime);
return instant.WithOffset(offset)
.LocalDateTime
.ToDateTimeUnspecified();
}

关于c# - 使用野田时间在时区之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252700/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com