在JavaScript中从其他语言环境年、月和日获取日期对象

zz2j4svz  于 2022-12-10  发布在  Java
关注(0)|答案(2)|浏览(129)

我有年、月、日像:

let dt = '1401/01/01'

区域设置如下:

let locale = 'fa-IR'

如何在不使用某些库的情况下从它创建日期对象?
类似于:

new Date(dt,locale)
dohp0rv5

dohp0rv51#

更新

看起来这个问题是关于伊斯兰(回历)日历日期的,不幸的是我对此并不了解。
然而,JavaScript Date对象似乎会带来一些困难,因为它指定了一个以自1970年1月1日以来所经过的毫秒数为度量单位的对象,因此它的基础是公历系统。
MDN还注意到Date.parse()方法只支持ISO 8601格式,这似乎也为不同的日历带来了问题。
Stack Overflow上也有this post,它似乎可以解决一个非常类似的问题,使用Intl.DateTimeFormat()在两个日历之间工作,并可能在这里提供OP需要的答案。
最后,JavaScript Temporal中的一个新的日期方法(截至2022年9月29日)仍在**阶段3的提议中***,但很可能在不久的将来成为规范的一部分。看起来Temporal修复了Date对象的许多缺点,并应该允许OP在这里提出的要求( 因为日历可以指定 *)

原始答案(* 无效 *)

JavaScript Date对象不接受语言环境作为参数,但是可以使用toLocaleStringtoLocaleDateString等方法输出特定语言环境下的日期。
因此,如果只想创建一个Date对象,只需传入日期/时间:

let dt = new Date("1401/01/01");

在这里,您可以对新创建的Date对象执行任何与日期相关的计算或方法。

let dt = new Date("1401/01/01");
console.log(dt.toLocaleString("fa-IR"));
8zzbczxx

8zzbczxx2#

Temporal API(即将成为JavaScript的一部分)可以帮助解决此用例。
虽然Temporal目前需要多边形填充(见此处的Temporal多边形填充列表),但Temporal目前正在所有主要浏览器(Chrome、Firefox、Safari等)中实现,因此在不久的将来将不需要多边形填充。
假设您使用的是persian日历(请参阅支持的日历here列表),您可以执行以下操作:

// Temporal polyfill. See https://github.com/tc39/proposal-temporal#polyfills
// has a list of actively-developed polyfills.
// Replace this import with whatever is required by your favorite polyfill.
import { Temporal } from '@js-temporal/polyfill';

let dt = '1401/01/01';
const [year, month, day] = dt.split('/');

// Create a Temporal.PlainDate object, interpreting year, month, and day
// according to the Persian calendar.
const date = Temporal.PlainDate.from({year, month, day, calendar: 'persian'});

// Format this date in Farsi, using the Persian calendar
console.log (date.toLocaleString('fa-IR', { calendar:'persian' }));
// => ۱۴۰۱/۱/۱

// Format this date in English, using the Persian calendar
console.log (date.toLocaleString('en-IR', { calendar:'persian' }));
// => 1/1/1401 AP

// Format this date in English, using the Gregorian calendar
console.log (date.withCalendar('gregory').toLocaleString('en-US', { calendar:'gregory' }));
// => 3/21/2022

// Format this date into a cross-platform, computer-readable format
console.log (date.toString());
// => 2022-03-21[u-ca=persian]

相关问题