将带时区的日期字符串转换为yyyy-mm-dd格式

时间:2018-08-23 12:26:59

标签: javascript date datetime locale

您好,我想知道是否可以转换此Date字符串:

Sat Aug 12 2000 00:00:00 GMT+0200 (Midden-Europese zomertijd)

更改为以下格式:

2000-08-12

我尝试了以下操作:

var DateInput = "Sat Aug 12 2000 00:00:00 GMT+0200 (Midden-Europese zomertijd)";
var test = new Date(DateInput);
console.log(test);

var convert_date = test.toString().split('-');
console.log(convert_date);

但这不起作用。谁能解释原因,并帮助我指引正确的方向?

4 个答案:

答案 0 :(得分:2)

看起来您实际上只是在尝试重新格式化输入日期字符串(不转换为本地时间)。您的尝试依靠Date进行字符串解析,不建议这样做(请参见JavaScript Date note regarding date string parameters)。它还使用toString,它依赖于实现,因此不能依赖于将输出重新格式化为yyyy-mm-dd这样的特定格式。

您不能只将日期字符串转换为Date对象,然后依赖于getDate()之类的方法,因为这些方法在本地时间返回的值可能与您尝试的日期值不同从输入的日期字符串中保留特定的时区。

如其他答案所述,有很多库可用于此类操作。否则,您可以尝试以下两种方法(请注意,日期字符串输入格式的变化可能会破坏这两种方法中的任何一种-因此存在这些库)。

@SergeyMetlov的钱记入two digit month and date formatting

如果日期字符串的格式与示例相同,则只需解析该字符串,然后根据需要重新格式化输出即可。

const input = 'Sat Aug 12 2000 00:00:00 GMT+0200 (Midden-Europese zomertijd)';

const format = (d) => (d < 10 ? '0' : '') + d;
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

// parse date string (lazy since time parts not used)
let [day, m, d, yyyy, ...time] = input.split(' ');

// two digit format for month and date
let mm = format(months.indexOf(m) + 1);
let dd = format(d);

// format date as yyyy-mm-dd
let date = yyyy + '-' + mm + '-' + dd;
console.log(date);

或者,如果您想强制提交js日期对象,则可以尝试以下类似的丑陋操作。该示例依靠Date.parse来解析输入日期字符串,不建议这样做,因为实现在浏览器之间可能不一致。如果您确实想执行类似的操作,则应使用自己的更好的解析方法来替换Date.parse(和笨拙的substr行)。

const input = 'Sat Aug 12 2000 00:00:00 GMT+0200 (Midden-Europese zomertijd)';

const format = (d) => (d < 10 ? '0' : '') + d;

let utc = Date.parse(input);
let localOffset = new Date().getTimezoneOffset() * 60000;
let inputOffset = input.substr(29, 4) * 60000;
let operator = input.substr(28, 1);
if (operator === '-') {
  inputOffset *= -1;
}

// convert utc to "wrong" date, will look "right" when formatted
let wrongDate = new Date(utc + localOffset + inputOffset);
let y = wrongDate.getFullYear();
let m = format(wrongDate.getMonth() + 1);
let d = format(wrongDate.getDate());
let output = y + '-' + m + '-' + d;
console.log(output);

答案 1 :(得分:0)

这应该有效test.getFullYear() + "-" + test.getMonth()+1 + "-" + test.getDate()

答案 2 :(得分:0)

使用 date-fns 来操作日期,它是非常酷的现代JavaScript日期实用程序库

例如:

var format = require('date-fns/format');
var result = format(new Date('Sat Aug 12 2000 00:00:00 GMT+0200 (Midden-Europese zomertijd)'),'YYYY-DD-MM');

链接:https://date-fns.org/v1.29.0/docs/format

答案 3 :(得分:0)

我实际上创建了这个dateFormat.js来精确地处理这种事情。它扩展了Date对象,只要您将文件包含在站点中,就可以使用

var date = new Date(); 
date.formatDateTime('YDM')

通过使用Date对象,您还可以设置要设置为正常格式的日期。