首页 > 解决方案 > 在Angular中解析日期时间字符串

问题描述

我构建了一个读取 SQL Server 中的 DateTime 字段的 Golang 服务器,它返回给我这种日期:“2020-05-28T11:14:26.227Z”,但是当我尝试在 TypeScript\Angular 中解析时,它返回给我这个:“ 28-05-2020 13 :14:26:227" 看起来增加了 2 小时。

也许是错误的时区?如何设置正确的时区?

数据库和角度应用程序都在我的电脑中(同一时区)

标签: angulartypescriptdatetimetimezone

解决方案


在服务器和 JavaScript 之间共享 DateTime 是正确的 PITA。我想忽略时区,并且觉得不需要整个库,例如 Moment,所以我为 Angular 编写了一个转换助手,如下所示:

在 JavaScript 中转换从服务器接收到的日期:

// Reverse the timezone offset (this might only work for timezones earlier than GMT - so test)
this.translateToClient = function (input) {
    if (!input) return null;
    let result = new Date(Date.parse(input));

    result.setMinutes(result.getMinutes() + result.getTimezoneOffset());

    return result;
};

在 JavaScript 中转换日期以发送回服务器:

// Send back UTC time instead of timezone time.
this.translateToServer = function (input) {
    if (!input) return null;

    return new Date(Date.UTC(
        input.getFullYear()
        , input.getMonth()
        , input.getDate()
        , input.getHours()
        , input.getMinutes()
        , input.getSeconds()
        , input.getMilliseconds()
    ));
};

注意:一些服务器技术(例如 ASP.NET)也可以自动应用时区偏移,这也必须正确配置。

我发现我需要像这样将我的 DateTime 发送给客户端:

DateTime.SpecifyKind(MyValue, DateTimeKind.Utc);

推荐阅读