0

我们必须为我们的客户端构建一个网站,在前端运行 Angular 9+,nodejs 是服务器后端应用程序。一切运作良好。

现在,我的客户希望最初为以下时区的客户提供支持:印度时间、太平洋时间、亚利桑那时间、山区时间、中部时间和东部时间。我们计划使用@js-joda/core 和@js-joda/timezone 来完成这项工作。

要求之一是验证用户输入的日期。日期必须仅属于当前月份。服务器设置为 UTC 时区。我们正在考虑将日期时间转换为 UTC,然后将其存储在(mongodb)数据库中。但是我们不确定如何使用 js-Joda 将给定的日期转换为 UTC。我们尝试使用以下代码,但它似乎没有转换。

var jsJoda = require("@js-joda/core");
require("@js-joda/timezone");

var indiaZone = jsJoda.ZoneId.of("Asia/Calcutta");
var localDateTime = jsJoda.LocalDateTime.parse("2021-10-05T23:18:09.905");**//<--user entry date**
var localTime = jsJoda.ZonedDateTime.of(localDateTime, indiaZone);
var utcZoned = jsJoda.ZonedDateTime.of(localTime, jsJoda.ZoneOffset.UTC);
console.log('Current Time in UTC: ' + utcZoned.toString()); 

我预计打印的日期会晚 5.5 小时,但事实并非如此。如果我的方向正确,您能否提供帮助,以及为什么 UTC 时间显示的时间相同?

4

2 回答 2

1

您可以使用ZonedDateTime#withZoneSameInstant来满足要求。

演示:

import {
  LocalDateTime,
  ZoneId,
  ZonedDateTime
} from "@js-joda/core";
import "@js-joda/timezone"; // Automatically adds timezone support

const zoneIdIndia = ZoneId.of("Asia/Kolkata");
const zoneIdUtc = ZoneId.of("Etc/UTC");

const ldt = LocalDateTime.parse("2021-10-05T23:18:09.905");
const zdtIndia = ldt.atZone(zoneIdIndia);
const zdtUtc = zdtIndia.withZoneSameInstant(zoneIdUtc);

console.log(zdtIndia.toString());
console.log(zdtUtc.toString());

输出:

2021-10-05T23:18:09.905+05:30[Asia/Kolkata]
2021-10-05T17:48:09.905Z[Etc/UTC]
于 2021-08-17T23:16:23.270 回答
0

我的问题是我在东部标准时间有一个字符串,我需要使用 jsJoda 将其转换为 UTC。

解决方案:

  • 日期:2021-05-21
  • 小时:22
  • 分钟:00
const jsJoda = require("@js-joda/core");
require('@js-joda/timezone');

let startTime = jsJoda.LocalDateTime.parse(`${date}T${hour}:${minute}`)
    .atZone(jsJoda.ZoneId.of("America/New_York"))
    .withZoneSameInstant(jshourJoda.ZoneId.of("UTC-00:00"));
  • _日期:LocalDate { _year: 2021, _month: 5, _day: 22 }
  • _时间:LocalTime { _hour: 2, _minute: 0, _second: 0, _nano: 0 }
于 2021-05-20T16:11:12.893 回答