如何将 ISO 日期转换为日期格式 yyyy-mm-dd?

如何从 ISO 8601日期获得具有 yyyy-mm-dd 格式的日期?

我的8601日期是

2013-03-10T02:00:00Z

我怎样才能得到以下信息?

2013-03-10
453594 次浏览

试试这个

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

更新: -

正如在评论中指出的那样,我正在更新答案,以便在需要时打印日期和月份的前导零。

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();


if (dt < 10) {
dt = '0' + dt;
}
if (month < 10) {
month = '0' + month;
}


console.log(year+'-' + month + '-'+dt);

您可以检出 等一下Luxon约会Day.js的良好日期操作。

或者只是提取 ISO 字符串的第一部分,它已经包含了您想要的内容。 下面是 T分裂的一个例子:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"

正在提取的另一个例子是前10个字符:

"2013-03-10T02:00:00Z".substr(0, 10) // "2013-03-10"

在 date 对象中传递日期:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

只要剪断绳子:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

或者,如果你只需要日期的字符串。

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

Moment.js 将为您处理日期格式。下面是如何通过 JavaScript 标记包含它,然后是如何使用 Moment.js 格式化日期的示例。

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>
moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

这将以 YYYY-MM-DD 格式输出日期:

let date = new Date();
date = date.toISOString().slice(0,10);
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();


if (dd<10) {
dd = '0' + dd;
}
if (mm<10) {
mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

用途:

new Date().toISOString().substring(0, 10);

解决方案进行扩展: 如果您希望格式中包含时间,可以将 toTimeString()添加到字符串中,然后去掉 GMT 部分,如下所示:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

我用了这个:

HTMLDatetoIsoDate(htmlDate){
let year = Number(htmlDate.toString().substring(0, 4))
let month = Number(htmlDate.toString().substring(5, 7))
let day = Number(htmlDate.toString().substring(8, 10))
return new Date(year, month - 1, day)
}


isoDateToHtmlDate(isoDate){
let date = new Date(isoDate);
let dtString = ''
let monthString = ''
if (date.getDate() < 10) {
dtString = '0' + date.getDate();
} else {
dtString = String(date.getDate())
}
if (date.getMonth()+1 < 10) {
monthString = '0' + Number(date.getMonth()+1);
} else {
monthString = String(date.getMonth()+1);
}
return date.getFullYear()+'-' + monthString + '-'+dtString
}

资料来源: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/

Moment.js 对于单个用例来说是一个相当大的库。我建议改用 date-fns。它基本上提供了 Moment.js 最多的功能,包的大小要小得多,而且有很多 formatting options

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

需要注意的一点是,由于它是 ISO 8601时间格式,浏览器通常将 UTC 时间转换为本地时区。虽然这只是一个简单的用例,但是您可以执行 '2013-03-10T02:00:00Z'.substring(0, 10);

对于更复杂的转换,date-fns是可行的方法。

我就是这么约会的:

let isoDate = "2013-03-10T02:00:00Z";


alert(isoDate.split("T")[0]);

使用下面的代码。它对你很有用。

let currentDate = new Date()
currentDate.toISOString()

如果你有一个日期对象:

let date = new Date()
let result = date.toISOString().split`T`[0]


console.log(result)

或者

let date = new Date()
let result = date.toISOString().slice(0, 10)


console.log(result)

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
alert(d.toLocaleDateString());

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy

对于所有使用拆分、切片和其他基于字符串的尝试来获取日期的人,您可能会设置与时区相关的失败!

ISO-String 包含 Zulu-Timezone 和一个根据这个时区的日期,这意味着它可能使用实际时区的前一天或后一天的日期,在转换链中必须考虑到这一点。

看这个例子:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);


console.log(timeZoneRelatedDate.toLocaleDateString(
'ja-JP',
{
year: 'numeric',
month: '2-digit',
day: '2-digit'
}
).replace(/\//gi,'-'));


// RESULT: "2020-01-14"


console.log(timeZoneRelatedDate.toISOString());


// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)


console.log(timeZoneRelatedDate.toISOString().slice(0,10));


// RESULT: "2020-01-13"

@ Hozefa提供的答案的更好版本。

如果安装了 date-fns,则可以使用 格式 ISO函数

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

格式化的最佳方法是使用 toLocaleDateString 和选项


const options = {year: 'numeric', month: 'numeric', day: 'numeric' };
const date = new Date('2013-03-10T02:00:00Z').toLocaleDateString('en-EN', options)


在这里检查日期部分的日期选项 https://www.w3schools.com/jsref/jsref_tolocalestring.asp

使用带有加拿大语言环境的 toLocaleDateString返回 ISO 格式的日期。

function getISODate(date) {
return date.toLocaleDateString('en-ca');
}
getISODate(new Date()); // '2022-03-24'


如果一个人正在寻找当前时区中的某一天,那么这些答案中的许多都可能给出具有误导性的结果。

此函数将输出与日期时区偏移量对应的日期:

const adjustDateToLocalTimeZoneDayString = (date?: Date) => {
if (!date) {
return undefined;
}
const dateCopy = new Date(date);
dateCopy.setTime(dateCopy.getTime() - dateCopy.getTimezoneOffset()*60*1000);
return dateCopy.toISOString().split('T')[0];
};

测试:

it('return correct day even if timezone is included', () => {
// assuming the test is running in EDT timezone
// 11:34pm eastern time would be the next day in GMT
let result = adjustDateToLocalTimeZoneDayString(new Date('Wed Apr 06 2022 23:34:17 GMT-0400'));
// Note: This is probably what a person wants, the date in the current timezone
expect(result).toEqual('2022-04-06');


// 11:34pm zulu time should be the same
result = adjustDateToLocalTimeZoneDayString(new Date('Wed Apr 06 2022 23:34:17 GMT-0000'));
expect(result).toEqual('2022-04-06');


result = adjustDateToLocalTimeZoneDayString(undefined);
expect(result).toBeUndefined();
});

误导方法:

为了证明其他答案的直接 ISOString().split()方法的问题,请注意下面的输出如何不同于人们可能期望的:

it('demonstrates how the simple ISOString().split() may be misleading', () => {
// Note this is the 7th
expect(new Date('Wed Apr 06 2022 23:34:17 GMT-0400').toISOString().split('T')[0]).toEqual('2022-04-07');
});

如果你有时区,你可以做:

const myDate = "2022-10-09T18:30:00.000Z"
const requestTimezone = "Asia/Calcutta";


const newDate = new Date(myDate).toLocaleString("en-CA", {
dateStyle: "short",
timeZone: requestTimezone,
});


console.log(newDate)
>> 2022-10-10

另一项产出:

const myDate = "2022-10-02T21:00:00.000Z"
const requestTimezone = "Asia/Jerusalem";
>> 2022-10-03


const myDate = "2022-09-28T04:00:00.000Z"
const requestTimezone = "America/New_York";
>> 2022-09-28

获得年份或月份的更简单方法

let isoDateTime = "2013-03-10T02:00:00Z";
console.log(isoDateTime.split("T")[0]); //2013-03-10

使用分割法

console.log(isoDateTime.split("-")[0]); //2013
console.log(isoDateTime.split("-")[1]); //03