Typescript 中的日期时间时区转换问题
Datetime timezone conversion issue in Typescript
我在 angular 中从 matDatePIcker 中选择了一个日期并将其传递给云应用程序。但是 DateTime 在传递到 API 之前会根据时区进行转换。当云函数对收到的数据进行日期计算时,这会导致日期不匹配。
例如:我选择日期 "2022-01-07"
然后将其字符串化并将其传递给 API 以便它与本地时区一起转换(我的是 'Asia/Kolkata')
并且刚刚收到它作为 "2022-01-06T18:30:00.000Z"
。我想用用户选择的确切日期转换它。目前,我试图将 local time zone
作为额外输入,然后需要将其转换为一个特定的时间日期。但给定的时区不能基于此直接转换。
任何人都可以提出解决这个问题的建议吗?
提前致谢。
您可以使用
将给定日期转换为时区的本地化字符串
new Date([your date].toLocaleString("en", { timeZone: [some timezone] }));
这里有个小帮手:
const dt = new Date(`2022/01/09`);
document.querySelector(`pre`).textContent = `now in\n \u2713 Kolkata: ${
dateTime4TZ(`Asia/Kolkata`)}\n \u2713 Amsterdam: ${
dateTime4TZ(`Europe/Amsterdam`)}\n \u2713 Tokyo: ${
dateTime4TZ(`Asia/Tokyo`)}\n \u2713 Auckland: ${
dateTime4TZ(`Pacific/Auckland`)}\n\n"2022/01/09" in\n \u2713 Kolkata: ${
dateTime4TZ(`Asia/Kolkata`, dt)}\n \u2713 Amsterdam: ${
dateTime4TZ(`Europe/Amsterdam`, dt)}\n \u2713 Tokyo: ${
dateTime4TZ(`Asia/Tokyo`, dt)}\n \u2713 Auckland: ${
dateTime4TZ(`Pacific/Auckland`, dt)}`;
function dateTime4TZ(timeZone, dt = new Date) {
const pad = (nr, len=2) => `${nr}`.padStart(len, `0`);
const localDT = new Date(dt.toLocaleString("en", { timeZone }));
return `${localDT.getFullYear()}-${
pad(localDT.getMonth() + 1)}-${
pad(localDT.getDate())}T${
pad(localDT.getHours())}:${
pad(localDT.getMinutes())}:${
pad(localDT.getSeconds())}.${
pad(localDT.getMilliseconds(), 3)}Z`;
};
<pre></pre>
我在 angular 中从 matDatePIcker 中选择了一个日期并将其传递给云应用程序。但是 DateTime 在传递到 API 之前会根据时区进行转换。当云函数对收到的数据进行日期计算时,这会导致日期不匹配。
例如:我选择日期 "2022-01-07"
然后将其字符串化并将其传递给 API 以便它与本地时区一起转换(我的是 'Asia/Kolkata')
并且刚刚收到它作为 "2022-01-06T18:30:00.000Z"
。我想用用户选择的确切日期转换它。目前,我试图将 local time zone
作为额外输入,然后需要将其转换为一个特定的时间日期。但给定的时区不能基于此直接转换。
任何人都可以提出解决这个问题的建议吗? 提前致谢。
您可以使用
将给定日期转换为时区的本地化字符串new Date([your date].toLocaleString("en", { timeZone: [some timezone] }));
这里有个小帮手:
const dt = new Date(`2022/01/09`);
document.querySelector(`pre`).textContent = `now in\n \u2713 Kolkata: ${
dateTime4TZ(`Asia/Kolkata`)}\n \u2713 Amsterdam: ${
dateTime4TZ(`Europe/Amsterdam`)}\n \u2713 Tokyo: ${
dateTime4TZ(`Asia/Tokyo`)}\n \u2713 Auckland: ${
dateTime4TZ(`Pacific/Auckland`)}\n\n"2022/01/09" in\n \u2713 Kolkata: ${
dateTime4TZ(`Asia/Kolkata`, dt)}\n \u2713 Amsterdam: ${
dateTime4TZ(`Europe/Amsterdam`, dt)}\n \u2713 Tokyo: ${
dateTime4TZ(`Asia/Tokyo`, dt)}\n \u2713 Auckland: ${
dateTime4TZ(`Pacific/Auckland`, dt)}`;
function dateTime4TZ(timeZone, dt = new Date) {
const pad = (nr, len=2) => `${nr}`.padStart(len, `0`);
const localDT = new Date(dt.toLocaleString("en", { timeZone }));
return `${localDT.getFullYear()}-${
pad(localDT.getMonth() + 1)}-${
pad(localDT.getDate())}T${
pad(localDT.getHours())}:${
pad(localDT.getMinutes())}:${
pad(localDT.getSeconds())}.${
pad(localDT.getMilliseconds(), 3)}Z`;
};
<pre></pre>