将 ISO-8601 字符串转换为本地日期(TypeScript/JavaScript)

6

我正在开发 Angular 6。当新记录被保存时,我将表单值作为 JSON 存储在数据库中。如果最终用户想要显示现有记录,则从 JSON 数据填充表单组件。但是,我在转换日期值时遇到了问题。我无法正确地转换本地日期。我尝试使用 moment,但没有成功:

console.log("string Value",stringValue);
let date = moment(stringValue,"yyyy-mm-ddThh:mm:ss.fffZ");                             
console.log("date",date.format('DD/MM/YYY HH:mm:ss'));

字符串值输出: 2019-01-17T21:00:00.000Z

控制台实际输出: 日期 18/01/2019 01:00:00

但是预期的控制台输出应该是:日期 18/01/2019 00:00:00

我尝试了使用 "YYYY-MM-DDThh:mm:ss.fffZ",但仍然无法解决问题。

额外信息:

保存数据:

process.data = JSON.stringify(this.form.getRawValue());
save(process);

HTML(PrimeNG):

<p-calendar formControlName="startDate" dateFormat="dd.mm.yy"></p-calendar>

你在哪个时区? - str
@str GMT+03:00 伊斯坦布尔 - Adem Aygun
你检查了计算机的时区设置吗?也许是由于错误的夏令时配置引起的。你使用的是哪个浏览器/操作系统版本? - str
2个回答

6
您可以使用moment.utc()来解析UTC时间,例如'2019-01-17T21:00:00.000Z'
默认情况下,moment会解析和显示本地时间。如果您想要解析或者显示UTC时间,则应该使用moment.utc()而不是moment()
然后,您可以使用local()将其转换为本地时区。
以下是一个实时示例:

const stringValue = '2019-01-17T21:00:00.000Z';
let date = moment.utc(stringValue).local();
console.log("date", date.format('DD/MM/YYYY HH:mm:ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>


奇怪的。如果输入字符串以“Z”结尾, moment 应该理解它是 UTC,无需显式使用 .utc() - Touffy
@VincenzoC 我试过了,但我错误地设置了表单控件,谢谢。 - Adem Aygun
@Touffy Z 代表 +00:00,我认为此时刻可以隐含理解输入是 UTC 时间。moment('2019-01-17T21:00:00.000Z') 将会得到与我回答中代码相同的输出,但我认为使用 moment.utc()local() 更加清晰易懂。可能最大的问题在于 OP 代码中的 yyyy-mm-ddThh:mm:ss.fffZ 标记。 - VincenzoC
如果有人仍在查看此答案,请注意,moment.js已被弃用。您不应再使用此库。 - JJE

0

moment-timezone 库旨在“解析和显示任何时区的日期”。

要在特定时区构建日期时间对象,请使用:

let now = moment.tz('Europe/Istanbul');

要查看协调世界时(UTC)的值,请使用以下语句

now.toISOString()

要查看本地时区值,请使用:

now.format('YYYY-MM-DD HH:mm:ss.SSS');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接