我有年、月和日,比如:
let dt = '1401/01/01'
在区域设置中,如:
let locale = 'fa-IR'
如何在不使用某些库的情况下从中创建日期对象?
类似于:
new Date(dt,locale)
Temporal API很快将成为JavaScript的一部分,它可以帮助实现这个用例。
虽然Temporal目前需要一个polyfill(请参阅此处的Temporal polyfill列表(,但Temporal当前正在所有主要浏览器(Chrome、Firefox、Safari等(中实现,因此在不久的将来将不需要polyfill。
假设您使用的是persian
日历(请参阅此处支持的日历列表(,您可以执行以下操作:
// 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]
更新
问题似乎是关于伊斯兰历日期的,不幸的是,我对伊斯兰历日期了解不多。
然而,JavaScriptDate
对象似乎会遇到困难,因为它指定了一个以自1970年1月1日以来经过的毫秒数衡量的对象。因此,它的基础是公历系统。
MDN还指出,Date.parse()
方法只支持ISO8601格式,这似乎也给不同的日历带来了问题。
还有一篇关于Stack Overflow的文章,它似乎解决了一个非常相似的问题,使用Intl.DateTimeFormat()
在两个日历之间工作,并可能在这里提供OP所需的答案。
最后,JavaScript Temporal中日期的一种新方法(截至2022年9月29日(仍在第三阶段提案中,但很可能在不久的将来成为规范的一部分。Temporal
似乎修复了Date
对象的许多缺点,并且应该允许OP在这里询问什么(因为可以指定日历(
原始答案(无效(
JavaScriptDate
对象不将区域设置作为参数。但是,您可以使用toLocaleString
和toLocaleDateString
等方法来输出特定区域设置中的日期。
因此,如果你只想创建一个Date
对象,你只需要输入日期/时间:
let dt = new Date("1401/01/01");
从那里,您可以在新创建的Date
对象上预生成任何与日期相关的计算或方法。如果您需要在特定的语言环境中输出日期,可以使用toLocaleString
:
let dt = new Date("1401/01/01");
console.log(dt.toLocaleString("fa-IR"));