如何解析包含时区的日期字符串?

时间:2018-11-06 07:49:06

标签: javascript date datetime momentjs datetime-format

我在字符串中有日期:

let day = "12/07/1998 12:30 GMT+4"

如何将其转换为即时日期? 我尝试过

let d = moment(day, 'DD/MM/YYYY HH:mm')

但是我不知道如何解析时区。我在documentation

中找不到它

3 个答案:

答案 0 :(得分:2)

更新于2018/11/6:

时刻的较新版本希望您将时区格式作为以下两个选项之一:

ZZ => -07:00 -06:00 ... +06:00 +07:00

Z => -0700 -0600 ... +0600 +0700

Read More Here..

因此,我们需要修复给定的 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>

要获得更多的时区控制:

https://momentjs.com/timezone/

答案 1 :(得分:1)

如果字符串不是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>

答案 2 :(得分:0)

解析时区字符串的最佳方法是使用moment时区。 你必须这样         moment.tz(day)