V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
est

Javascript 一句话获得农历

  •  6
     
  •   est · Sep 10, 2020 · 8672 views
    This topic created in 2063 days ago, the information mentioned may be changed or developed.

    今天看到有人说 Intl 这个 ECMAscript 内置对象,就翻了一下,发现可以一句话算农历。

    new Date().toLocaleString('zh-CN-u-ca-chinese').replace(/(\d+)年 /, (_,y)=>"甲乙丙丁戊己庚辛壬癸".charAt((y-4)%10) + "子丑寅卯辰巳午未申酉戌亥".charAt((y-4)%12))
    

    大家还有更简单或者更短的办法么。交流一下。

    Supplement 1  ·  Sep 10, 2020

    多了个空格。囧。

    new Date().toLocaleString('zh-CN-u-ca-chinese').replace(/(\d+)\s*?年/, (_,y)=>"甲乙丙丁戊己庚辛壬癸".charAt((y-4)%10) + "子丑寅卯辰巳午未申酉戌亥".charAt((y-4)%12))
    
    Supplement 2  ·  Sep 10, 2020

    感谢 @sarvatathagata 的最简单方法:

    new Date().toLocaleString('ja-JP-u-ca-chinese')
    

    我写了个博客稍微解释下这个 toLocaleString() https://blog.est.im/202009/stdout-008

    43 replies    2020-09-12 23:55:48 +08:00
    honjow
        1
    honjow  
       Sep 10, 2020
    只是年吗?
    est
        2
    est  
    OP
       Sep 10, 2020 via Android
    @honjow 月 日 也有的
    jchencode
        3
    jchencode  
       Sep 10, 2020
    这个方法不错,收藏了。
    ccccccc
        4
    ccccccc  
       Sep 10, 2020
    好像不大行?

    new Date().toLocaleString('zh-CN-u-ca-chinese').replace(/(\d+)年 /, (_,y)=>"甲乙丙丁戊己庚辛壬癸".charAt((y-4)%10) + "子丑寅卯辰巳午未申酉戌亥".charAt((y-4)%12))
    "2020 年七月 23 下午 8:34:56"
    new Date().toLocaleString('zh-CN-u-ca-chinese')
    "2020 年七月 23 下午 8:35:21"
    Mutoo
        5
    Mutoo  
       Sep 10, 2020
    new Date().toLocaleString('zh-u-ca-chinese-nu-hanidec')
    "二〇二〇年七月二三 下午一〇:五〇:三六"
    est
        6
    est  
    OP
       Sep 10, 2020
    @ccccccc 正则里处理一下空格。估计你本地设置了日期格式。

    new Date().toLocaleString('zh-CN-u-ca-chinese').replace(/(\d+)\s*?年 /, (_,y)=>"甲乙丙丁戊己庚辛壬癸".charAt((y-4)%10) + "子丑寅卯辰巳午未申酉戌亥".charAt((y-4)%12))
    em2046
        7
    em2046  
       Sep 10, 2020
    @Mutoo Safari 为
    "三七 /七 /二三 下午一〇:三七:三五"
    est
        8
    est  
    OP
       Sep 10, 2020
    @em2046 37 这个我也遇到过。可以把两个 charAt 里的 -4 改成 -1 。。正则再调整一下。蛤蛤蛤蛤
    unicloud
        9
    unicloud  
       Sep 10, 2020 via iPhone
    还有这种操作?
    sarvatathagata
        10
    sarvatathagata  
       Sep 10, 2020   ❤️ 21
    @est 其实压根就不用正则的,直接 new Date().toLocaleString('ja-JP-u-ca-chinese')就可以了
    dfourc
        11
    dfourc  
       Sep 10, 2020
    @sarvatathagata #10 哈哈哈哈哈哈 楼主尴尬了
    w3cfed
        12
    w3cfed  
       Sep 10, 2020
    @sarvatathagata 秀丫。收藏了。
    est
        13
    est  
    OP
       Sep 10, 2020
    @sarvatathagata 你。。。作弊!
    baobao1270
        14
    baobao1270  
       Sep 11, 2020
    ICU 这个工具是个宝
    但是这个也需要浏览器支持吧

    IE 11 是这样表现的:
    new Date().toLocaleString('zh-CN-u-ca-chinese')
    "‎2020‎年‎9‎月‎11‎日‎ ‎0‎:‎23‎:‎19"

    感觉农历很麻烦的一点在于,它是需要结合天文观测测算的。而 ICU 的推算注定是不准的,因为其基准的时间戳是无法与农历用公式对应的。
    x86
        15
    x86  
       Sep 11, 2020
    长知识了,太秀了
    hlwjia
        16
    hlwjia  
    PRO
       Sep 11, 2020
    如果楼主是一句话获得农历,那 @sarvatathagata 的就是“半句话获得农历”了
    ericgui
        17
    ericgui  
       Sep 11, 2020
    看了你的博客,似乎标准库的工作量还是非常大的
    AmrtaShiva
        18
    AmrtaShiva  
       Sep 11, 2020 via iPhone
    你能算出农历日来?
    Doracis
        19
    Doracis  
       Sep 11, 2020
    你这个头像和施瓦辛格的头像好像,果然猛男都是喜欢粉色吗。。
    est
        20
    est  
    OP
       Sep 11, 2020
    @Doracis 你被奇怪的东西吸引了。。。。
    flowfire
        21
    flowfire  
       Sep 11, 2020
    用 fetch 不好吗啊(手动狗头
    chotow
        22
    chotow  
       Sep 11, 2020
    为什么是「 ja-JP 」呢?这不是日本的意思吗 😕️
    LeemengG
        23
    LeemengG  
       Sep 11, 2020
    @chotow 估计是日本人现在某些场景也提供 农历 的选项
    en20
        24
    en20  
       Sep 11, 2020
    @LeemengG 日本不是用 令和 x 年 吗
    no1xsyzy
        25
    no1xsyzy  
       Sep 11, 2020   ❤️ 1
    @sarvatathagata 但是相应地丢掉了腊月和正月…… 以及闰月的 “闰” 字变繁体
    hahastudio
        26
    hahastudio  
       Sep 11, 2020
    说起来,闰月还是每年通过紫金山天文台定的么
    DsuineGP
        27
    DsuineGP  
       Sep 11, 2020
    话说 “九月第二周的周五” 这个在 js 里面怎么方便的实现啊
    KouShuiYu
        28
    KouShuiYu  
       Sep 11, 2020
    农历是没有规律的没办法算
    Guidoo
        29
    Guidoo  
       Sep 11, 2020
    博客的风格挺喜欢的, 有 github 地址吗 嘿嘿
    no1xsyzy
        30
    no1xsyzy  
       Sep 11, 2020
    @en20 这里指定了 ca-chinese,或者说等价于在 options 里面填入 {calendar: 'chinese'}
    即是指定了采用传统农历

    相应地,如果是 ja-JP-u-ca-japanese 则采用令和。不过默认的 era 属性为 narrow,导致令和显示为 `R`,需要手动指定 options 里的 {era: 'long'} 或者 {era: 'short'}
    cjc2017
        31
    cjc2017  
       Sep 11, 2020
    涨姿势了
    est
        32
    est  
    OP
       Sep 11, 2020
    est
        33
    est  
    OP
       Sep 11, 2020   ❤️ 1
    @DsuineGP 找个日期库什么的吧。。这个帮不了。
    zhw2590582
        34
    zhw2590582  
       Sep 11, 2020
    666
    Balibabo
        35
    Balibabo  
       Sep 11, 2020
    有点意思啊这个
    hgjian
        36
    hgjian  
       Sep 11, 2020 via Android
    推荐给大家一个库:
    https://blog.jjonline.cn/userInterFace/173.html
    我的网站顶部用的是这个:
    https://www.bas369.com
    zyc63959
        37
    zyc63959  
       Sep 11, 2020
    请教下各位,这个里面节气是怎么用的?
    veveue
        38
    veveue  
       Sep 12, 2020
    Linux x86_64 不行
    est
        39
    est  
    OP
       Sep 12, 2020 via Android
    @veveue 兄弟这个是啥浏览器?版本要新一点的才支持。nodejs 的 v8 版本也太低不支持的。
    est
        40
    est  
    OP
       Sep 12, 2020 via Android
    @zyc63959 节气可以在 icu 里调出来,js 的日期对象估计调不出来
    rus4db
        41
    rus4db  
       Sep 12, 2020
    感谢分享
    gromit1337
        42
    gromit1337  
       Sep 12, 2020 via iPhone
    楼主博客啥模版?想抄
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5709 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 124ms · UTC 08:43 · PVG 16:43 · LAX 01:43 · JFK 04:43
    ♥ Do have faith in what you're doing.