【发布时间】:2021-12-31 07:37:28
【问题描述】:
我需要将 17Dec2010 的 javascript 日期解析为 javascript 日期。 该怎么做?
【问题讨论】:
标签: javascript
我需要将 17Dec2010 的 javascript 日期解析为 javascript 日期。 该怎么做?
【问题讨论】:
标签: javascript
简短的回答是:在 JavaScript 中没有标准的方法可以做到这一点,你必须自己做。 JavaScript 最近才获得any 日期的标准字符串表示(从 ECMAScript 第 5 版开始,大约一年前 - 格式是 ISO-8601 的简化版本),而您的格式与该格式不匹配.
但是,有一些附加库可以提供帮助,例如 DateJS。
您的特定格式很容易解析(见下文),但如果您遇到变体,它会很快变得复杂。
简单示例:
var months = {
en: {
"jan": 0,
"feb": 1,
"mar": 2,
"apr": 3,
"may": 4,
"jun": 5,
"jul": 6,
"aug": 7,
"sep": 8,
"oct": 9,
"nov": 10,
"dec": 11
}
};
var dateString = "17Dec2010";
var dt = new Date(
parseInt(dateString.substring(5), 10), // year
months.en[dateString.substring(2, 5).toLowerCase()], // month
parseInt(dateString.substring(0, 2), 10) // day
);
alert(dt); // alerts "Fri Dec 17 2010 00:00:00 GMT+0000 (GMT)" or similar
...但它只处理英语(因此months 的en 属性),而且它会很快变得复杂。
mplungjan 非常正确地指出上述操作将失败,例如“7Dec2010”。这是一个更灵活的版本,但如果格式有任何变化,我可能会再看一个库:
var months = {
en: {
"jan": 0,
"feb": 1,
"mar": 2,
"apr": 3,
"may": 4,
"jun": 5,
"jul": 6,
"aug": 7,
"sep": 8,
"oct": 9,
"nov": 10,
"dec": 11
}
};
var dateString = "17Dec2010";
var parts = /^(\d+)(\D+)(\d+)$/.exec(dateString);
if (parts && parts.length == 4) {
var dt = new Date(
parseInt(parts[3], 10), // year
months.en[parts[2].toLowerCase()], // month
parseInt(parts[1], 10) // day
);
display(dt);
}
else {
display("Date '" + dateString + "' not recognized");
}
【讨论】:
使用 Crowder 的 regExp 而不是我第一次回答时想出的那个,不需要月份数组。我的脚本在 Windows 和黑莓本机浏览器上的 IE8、Fx 3.6、Opera 10、Safari 5、Mozilla 1.7 中进行了测试。如果字符串的月份部分是英文,那么所有主要的浏览器,甚至一些不太主要的浏览器 - 我希望所有支持 javascript 和 Date.parse 支持的浏览器都能很好地处理我的脚本。 MDC 说 Date.parse 执行 RFC822
<script type="text/javascript">
var date = "12Dec2011"
var reg = /^(\d+)(\D+)(\d+)$/
var parts = reg.exec(date)
var dateString = parts[1]+' '+parts[2]+' '+parts[3]; // parts[0] is the match itself
alert(new Date(Date.parse(dateString)))
</script>
【讨论】:
/(\d+)(\D+)(\d+)$/,这意味着“一系列一个或多个数字后跟一系列一个或多个非-digits 后跟一系列一个或多个数字”。
Date 构造函数或Date.parse 接受月份名称,无论是英文还是其他形式。一些实现会这样做,但它是依赖于实现的,而不是指定的行为。请参阅the spec 的第 15.9.1.15 节。
这是一个基于 Python 的 time 模块的小型(至少在您取出 cmets 后)utility I wrote - 它采用格式字符串并相应地生成正则表达式以提取日期信息。 unit tests 无需深入了解代码即可了解其功能,但在您的情况下:
>>> var parts = time.strptime('17Dec2010', '%d%b%Y');
>>> var date = new Date(parts[0], parts[1]-1, parts[2]);
Fri Dec 17 2010 00:00:00 GMT+0000 (GMT Standard Time) {}
它还会处理基本验证:
>>> try
... {
... time.strptime('32Dec2010', '%d%b%Y');
... }
... catch (e)
... {
... console.log(e);
... }
Error: Day is out of range: 32
如果您需要,它也可以采用其他方式:
>>> time.strftime(date, '%d%b%Y');
"17Dec2010"
【讨论】:
Date JS 太棒了。
【讨论】: