如何解析包含时区的日期字符串?
How to parse a date String containing a timezone?
我在字符串中有日期:
let day = "12/07/1998 12:30 GMT+4"
如何将其转换为时刻日期?
我试过了
let d = moment(day, 'DD/MM/YYYY HH:mm')
但我不知道如何解析时区。我在 documentation
中找不到它
2018/11/6 更新:
较新版本的 moment 希望您将时区格式作为以下两个选项之一传递:
ZZ=>
-07:00 -06:00 ... +06:00 +07:00
或
Z =>
-0700 -0600 ... +0600 +0700
所以我们需要修复给定的 GMT+4 格式以匹配输入大小写我们将使用一些正则表达式和 es6 模板来 重新格式化 我们给定的日期是这样的:
DD/MM/YYYY hh:mm ZZ
最后通知'ZZ':
演示:
let date = "12/07/1998 12:30 GMT+4"
let justDayAndTime = date.split(/(GMT(\+|\-)\d+)/)[0].trim()
let zone = date.match(/\d+$/)[0]
let mark = date.match(/(\+|\-)/)[0]
let parsed = `${justDayAndTime} ${mark}${moment(zone,"k").format("HH:mm")}`
let result = moment(parsed,"DD/MM/YYYY hh:mm ZZ")
console.log(result.format('LLLL'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
答案:
可以使用format方法
moment("12/07/1998 12:30 GMT+4").format('DD/MM/YYYY HH:mm')
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
更多时区控制:
如果字符串不是 ISO 8601 或 RFC 2822 格式,Moment.js 不一定会解析时区。它期望时区采用±HHmm 格式,因此 GMT+4
被忽略。
如果您将字符串传递给没有格式信息的构造函数,您将收到警告,也许它会被正确解析,也许不会。
如果您无法在源头修复输入格式,您可以在最后修复它(前提是您知道格式),然后在解析标记中提供 "Z",例如:
/* Fix offset like GMT+4 to +0400
* If offset is 1 digit, pad to 0d00 -8 -> -0800
* If offset is 2 digits, pad to dd00 +10 -> +1000
* If offset is 3 digits, padd to 0ddd +530 -> +0530
* If offset is 4 digits, leave as is +1030 -> +1030
*/
function fixOffset(s) {
var tz = s.match(/(GMT)([+-])(\d+)$/);
// If not required format, do nothing
if (tz.length != 4) return;
var h = tz[3];
var offset = h.length == 1? '0' + h + '00' :
h.length == 2? h + '00' :
h.length == 3? '0' + h : h;
return s.replace(/GMT[+-]\d+$/, tz[2] + offset);
}
var s = "12/07/1998 12:30 GMT+4";
s = fixOffset(s);
console.log('Fixed format: ' + s);
console.log( moment(s,'DD/MM/YYYY HH:mm Z').format('LLLL') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
解析时区字符串的最佳方法是使用时刻时区。
你必须这样做
moment.tz(day)
我在字符串中有日期:
let day = "12/07/1998 12:30 GMT+4"
如何将其转换为时刻日期? 我试过了
let d = moment(day, 'DD/MM/YYYY HH:mm')
但我不知道如何解析时区。我在 documentation
中找不到它2018/11/6 更新:
较新版本的 moment 希望您将时区格式作为以下两个选项之一传递:
ZZ=>
-07:00 -06:00 ... +06:00 +07:00
或
Z =>
-0700 -0600 ... +0600 +0700
所以我们需要修复给定的 GMT+4 格式以匹配输入大小写我们将使用一些正则表达式和 es6 模板来 重新格式化 我们给定的日期是这样的:
DD/MM/YYYY hh:mm ZZ
最后通知'ZZ':
演示:
let date = "12/07/1998 12:30 GMT+4"
let justDayAndTime = date.split(/(GMT(\+|\-)\d+)/)[0].trim()
let zone = date.match(/\d+$/)[0]
let mark = date.match(/(\+|\-)/)[0]
let parsed = `${justDayAndTime} ${mark}${moment(zone,"k").format("HH:mm")}`
let result = moment(parsed,"DD/MM/YYYY hh:mm ZZ")
console.log(result.format('LLLL'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
答案:
可以使用format方法
moment("12/07/1998 12:30 GMT+4").format('DD/MM/YYYY HH:mm')
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
更多时区控制:
Moment.js 不一定会解析时区。它期望时区采用±HHmm 格式,因此 GMT+4
被忽略。
如果您将字符串传递给没有格式信息的构造函数,您将收到警告,也许它会被正确解析,也许不会。
如果您无法在源头修复输入格式,您可以在最后修复它(前提是您知道格式),然后在解析标记中提供 "Z",例如:
/* Fix offset like GMT+4 to +0400
* If offset is 1 digit, pad to 0d00 -8 -> -0800
* If offset is 2 digits, pad to dd00 +10 -> +1000
* If offset is 3 digits, padd to 0ddd +530 -> +0530
* If offset is 4 digits, leave as is +1030 -> +1030
*/
function fixOffset(s) {
var tz = s.match(/(GMT)([+-])(\d+)$/);
// If not required format, do nothing
if (tz.length != 4) return;
var h = tz[3];
var offset = h.length == 1? '0' + h + '00' :
h.length == 2? h + '00' :
h.length == 3? '0' + h : h;
return s.replace(/GMT[+-]\d+$/, tz[2] + offset);
}
var s = "12/07/1998 12:30 GMT+4";
s = fixOffset(s);
console.log('Fixed format: ' + s);
console.log( moment(s,'DD/MM/YYYY HH:mm Z').format('LLLL') );
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
解析时区字符串的最佳方法是使用时刻时区。
你必须这样做
moment.tz(day)