我已经制作了Chrome扩展程序,最近Chrome的更新破坏了我的一些代码。我发现他们已经秘密改变了.DateTimeFormat
的行为(感谢让Google变得更难)。在更新到Chrome 38之前,此代码会根据中国日历返回当前年份的编号,即31
(〜2014 - 2015年公历中的年份):
Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(new Date()); //31年
由于在the Chinese numbering system中,base-10用于第10位,base-12用于第1位,要将数字31转换为中文编号,使用此代码:< / p>
var y = +Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(date).match(/\d+/)[0],
天干 = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"], //base 10
地支 = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]; //base 12
y = 天干[(y-1)%10] + 地支[(y-1)%12]; //甲午
但是现在,Chrome 自动而不是返回号码,而是为我完成了所有转化。现在返回的值只是"甲午年"
,这会破坏我的代码,特别是这部分:
.match(/\d+/)[0]
我不能只删除我手动转换,因为不是每个用户都会使用最新版本的Chrome。处理这种情况的好方法是什么?
答案 0 :(得分:1)
好吧,正如你所指出的那样,match(/\d+/)
失败了。分支就是这样。
您可以执行以下操作:
var x = Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(date);
if(x.match(/\d+/)){
var y = +x.match(/\d+/)[0];
/* old logic */
} else {
/* new logic */
}
或者,或者,在清单中使用"minimum_chrome_version" : "38"
推送更新。运行旧版本的用户应使用旧版扩展程序。
答案 1 :(得分:1)
在尝试转换之前,简单测试返回值是否包含数字(或者相反,在尝试提取数字之前检查返回值是否看起来像有效的日期格式):
var y = +Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(date);
if (/\d/.test(y)) {
y = y.match(/\d+/)[0];
var 天干 = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]; //base 10
var 地支 = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]; //base 12
y = 天干[(y-1)%10] + 地支[(y-1)%12]; //甲午
}
每当您遇到无法以这种方式检测到的问题时,您可以尝试确定在哪个版本的Chrome中引入了更改,并从navigator.userAgent
中提取Chrome版本以进行比较。