Please enable Javascript to view the contents

JavaScript一行代码get到农历日期

 ·  ☕ 3 分钟

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)扩展。它可以用于请求一个自定义区域特定行为的 CollatorNumberFormat,或者 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

参考资料

分享

码中人
作者
码中人
Web Developer