gpt4 book ai didi

asp.net - NodaTime 转换(第 2 部分)。如何?

转载 作者:行者123 更新时间:2023-12-03 14:41:35 27 4
gpt4 key购买 nike

在我的第一篇文章之后:

DateTime conversions using NodaTime on ASP.Net MVC 3 Razor website. How to?

我正在努力寻找一种使用 NodaTime 在本地和 UTC(两种方式)之间转换日期/时间的简单方法。

当前图片为:

  • 我在数据库中将日期/时间保存为 UTC。
  • 在向用户显示时,我应该考虑本地时区并相应地进行转换。
  • 当用户提供日期/时间作为过滤器时,我需要在发送到 SQL 查询之前将其转换回 UTC。

  • 我目前拥有的:

    从 UTC 转换为本地的扩展(这部分工作正常):
        public static DateTime UTCtoLocal(this DateTime dateTime)
    {
    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;

    var utcTimeZone = timeZoneProvider["UTC"];
    var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);

    var zonedDbDateTime = utcTimeZone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb));

    var usersTimezoneId = "Europe/London"; //just an example
    var usersTimezone = timeZoneProvider[usersTimezoneId];

    var usersZonedDateTime = zonedDbDateTime.WithZone(usersTimezone);

    return usersZonedDateTime.ToDateTimeUnspecified();
    }

    从本地转换回 UTC 的扩展(这部分是问题):
        public static DateTime LocaltoUTC(this DateTime dateTime)
    {
    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
    var usersTimezoneId = "Europe/London";
    var usersTimezone = timeZoneProvider[usersTimezoneId];

    var dateTimeFromDb = new DateTime(dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, dateTime.Second, dateTime.Millisecond);
    var zonedDbDateTime = usersTimezone.AtLeniently(LocalDateTime.FromDateTime(dateTimeFromDb));

    var utcTimezoneId = "UTC";
    var utcTimezone = timeZoneProvider[utcTimezoneId];

    var utcZonedDateTime = zonedDbDateTime.WithZone(utcTimezone);

    return utcZonedDateTime.ToDateTimeUtc();
    }

    我在这里做错了什么?

    最佳答案

    老实说,您的 UTCToLocal 看起来比它需要做的工作更多。

    它应该只是:

    // Note: the DateTime here must have a "Kind" of Utc.
    public static DateTime UTCtoLocal(this DateTime dateTime)
    {
    Instant instant = Instant.FromDateTimeUtc(dateTime);
    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
    var usersTimezoneId = "Europe/London"; //just an example
    var usersTimezone = timeZoneProvider[usersTimezoneId];
    var usersZonedDateTime = instant.InZone(usersTimezone);
    return usersZonedDateTime.ToDateTimeUnspecified();
    }

    同样,您的 LocalToUTC 应该遵循以下原则:
    // The DateTime here should have a "Kind" of Unspecified
    public static DateTime LocaltoUTC(this DateTime dateTime)
    {
    LocalDateTime localDateTime = LocalDateTime.FromDateTime(dateTime);

    IDateTimeZoneProvider timeZoneProvider = DateTimeZoneProviders.Tzdb;
    var usersTimezoneId = "Europe/London";
    var usersTimezone = timeZoneProvider[usersTimezoneId];

    var zonedDbDateTime = usersTimezone.AtLeniently(localDateTime);
    return zonedDbDateTime.ToDateTimeUtc();
    }

    您无需将其转换为不同的时区: ZonedDateTime知道瞬间是什么,并且 ToDateTimeUtc会做正确的事。请注意,没有真正的 dateTimeFromDb在这里,因为如果您要从未指定的 DateTime 转换,这大概是来自用户...

    关于asp.net - NodaTime 转换(第 2 部分)。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16674008/

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