Tag: timezoneoffset

使用Noda Time在时区之间进行转换

我目前正在尝试确保我们的传统后端可以根据用户的当前时区(或更具体地说是偏移量)支持解析日期时间。 我们的服务器在东部标准时间,我们的大部分日期时间都来自那里。 但是,对于位于其他时区的用户,在检索这些日期时间时需要转换到其时区(或者,在这种情况下为偏移)。 此外,来自用户的日期时间必须在服务器上持久化之前转换为东部标准时间。 鉴于我们正在开发的前端是基于Web的,我能够在几分钟内检索用户的偏移量,并将该值传递到标头内的服务层。 我看了Noda Time并认为它是一个很棒的API。 它确实迫使我在更精致的事情中考虑时间,但我仍然不能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 […]

为什么C#没有检测到1970/1/1是否属于BST?

我正在使用第三方API,它返回时间值作为DateTime值填充1970年1月1日作为日期部分。 因此,对于1969-12-31T21:03:00.000-08:00 5点,它将返回类似1969-12-31T21:03:00.000-08:00 问题是,如果用户在伦敦时间,则C#无法应用1970-01-01的BST调整。 例如,UTC的1970-01-01 5AM应该是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日,则相同的代码可以正常打印6AM。 为什么它会这样? 我该如何解决这个问题? 我们的应用程序需要跨任何TimeZone工作(即硬编码时区不是一个选项 – 我们基本上使用Windows本地时区)。

在我的数据库中存储时区信息的最佳方法是什么?

我有一个asp.net-mvc网站,我接手了一个页面页面,人们输入信息和时间(包括当地时区)。 数据库持续开始时间,结束时间和时区,因为它对我来说感觉有点不稳定。 这是获取列表的代码: static private IEnumerable GetTimeZones(string selected) { var timeZoneNames = TimeZoneInfo.GetSystemTimeZones() .Where(tz => tz.DisplayName.Contains(“London”) || tz.DisplayName.Contains(“Hong Kong”) || tz.DisplayName.Contains(“Mumbai”) || tz.DisplayName.Contains(“Eastern Time”)) .ConvertAll(tz => tz.DisplayName).ToList(); var items = new List(); foreach (var item in timeZoneNames) { var slItem = new SelectListItem(); slItem.Text = item; slItem.Value = item; slItem.Selected = item == selected; items.Add(slItem); […]