加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 23:36:42 所属栏目:asp.Net 来源:网络整理
导读:跟随我的第一篇文章: DateTime conversions using NodaTime on ASP.Net MVC 3 Razor website. How to? 我正在努力寻找一种简单的方式来转换本地和UTC之间的日期/时间(两种方式),使用NodaTime. 目前的图片是: 我在数据库中保存了UTC的日期/时间. 将它显示给
跟随我的第一篇文章:

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

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

目前的图片是:

>我在数据库中保存了UTC的日期/时间.
>将它显示给用户时,我应该考虑当地时区并相应地进行转换.
>当用户提供日期/时间作为过滤器时,我需要将其转换回UTC,然后再发送到SQL查询.

我到目前为止

扩展从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.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转换,那可能来自用户…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读