javascript一行代码获取农历日期:
new Date().toLocaleString('ja-JP-u-ca-chinese')
toLocaleString() 方法返回该日期对象的字符串,该字符串格式因不同语言而不同。新增的参数 locales 和 options 使程序能够指定使用哪种语言格式化规则,允许定制该方法的表现(behavior)。在旧版本浏览器中, locales 和 options 参数被忽略,使用的语言环境(浏览器环境)和返回的字符串格式是各自独立实现的。
Locales 参数
locales
参数必须是一个 BCP 47 语言标记的字符串,或者是一个包括多个语言标记的数组。如果 locales
参数未提供或者是 undefined,便会使用运行时默认的 locale。
一个 BCP 47 语言标记代表了一种语言或者区域(两者没有很大的区别)。在其最常见的格式中,它以这样的顺序囊括了这些内容:语言代码,脚本代码,和国家代码,全部由连字符分隔开。例如:
"hi"
:印地语 (primary language)。"de-AT"
:在奥地利使用的德语 (primary language with country code)。
"zh-Hans-CN"
:在中国使用的简体中文 (primary language with script and country codes)。
所以:
const date = new Date();
date.toLocaleString('zh'); // 2020/9/15 下午11:14:06
date.toLocaleString('en'); // 9/15/2020, 11:14:06 PM
BCP 47 也支持扩展,其中一个和 JavaScript 国际化方法相关的是:“u”(Unicode)扩展。它可以用于请求一个自定义区域特定行为的 Collator
,NumberFormat
,或者 DateTimeFormat
对象。例如:
"de-DE-u-co-phonebk"
:使用德语的电话簿排序变体,这会把元音变音扩展成字符对:ä → ae, ö → oe, ü → ue。"th-TH-u-nu-thai"
:在数字格式中使用泰语的数值表示(๐, ๑, ๒, ๓, ๔, ๕, ๖, ๗, ๘, ๙)"ja-JP-u-ca-japanese":在日期和时间格式化中使用日本的日历表示方式,所以 2013 会表示为平成 25。
"zh-Hans-u-ca-chinese":在日期和时间格式化中使用中国农历表示方式。
"en-GB-u-ca-islamic"
: use British English with the Islamic (Hijri) calendar, where the Gregorian date 14 October, 2017 is the Hijri date 24 Muharram, 1439.
zh-Hans 表示简体中文, -u-key1-value1-key2-value2… 表示打开U扩展,-ca 表示 calendar 日历,-chinese 表示农历。
所以理论上得到中国农历日期应该是:
new Date().toLocaleString('zh-Hans-u-ca-chinese')
其结果是:
2020年七月28 下午11:31:12
以上结果虽然是农历日期,但是年份没有按干支纪年法表示,不够完美。
但如果使用new Date().toLocaleString(‘ja-JP-u-ca-chinese’),很明显ja-JP-u-ca-chinese中的jp是日本的代称,我这里不是什么民族主义,主要是不能望文生义,不贴切。
所以,我觉得比较好的实现方法是:
new Date().toLocaleString('zh-CN-u-ca-chinese')
.replace(/(\d+)\s*?年/, (_,y)=>"甲乙丙丁戊己庚辛壬癸".charAt((y-4)%10)
+ "子丑寅卯辰巳午未申酉戌亥".charAt((y-4)%12))
结果:
庚子七月28 下午11:39:29
参考资料