在JavaScript中将ISO日期转换为日期格式yyyy-mm-dd


Answers:


99

试试这个

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);


17
请注意,我认为这不会在日或月中显示前导零
user3413723

2
同意@ user3413723,这不能回答问题,因为它删除了前导0,因此不符合YYYY-MM-DD格式的要求
James Murphy

工作正常@Mritunjay
Ravi Delixan 2015年

与DriveByPoster的答案相比,这更长且更容易出现错字。但我不会拒绝投票,因为它与语言无关。它只是不使用我们提供的简单工具。
RoboticRenaissance

先生,您能告诉我如何在新的Date(date)中传递2013 3 1这种格式的日期
Kapil soni

142

只是裁剪字符串:

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);

3
我认为这是所有解决方案中最简单,最优雅的解决方案,但是这有什么失败吗?
Aida_Aida

30
@Aida_Aida我唯一想到的问题是,如果您的代码在未来至少8000年处理地理时间,则代码可能会因为格式为YYYYY-MM-DD10000年而中断。为避免这种情况,您可以在T字符代替。(见en.wikipedia.org/wiki/Year_10,000_problem
apsillers

9
由于ISOString为UTC但Date对象为本地,因此这种方式将无法正确处理时区。您必须考虑到这一点。
Guillaume F.

3
@GuillaumeF。一个重要的考虑因素,但它确实符合OP的要求
jamesjansson

我无法理解为什么将字符串解析为Date。该子串的选择似乎是最简单的答案。
RobG

45

您可以签出Moment.jsLuxondate- fnsDay.js以进行良好的日期操作。

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

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

14

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"

尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中添加解释性注释,因为这会降低代码和解释的可读性!
再见StackExchange

2
moment是一个非常庞大的库,仅用于格式化。而是使用大小更小且具有相同功能的date-fns
Hozefa

@Hozefa,然后用您的解决方案回答OP问题。
哈里斯(Harris)

1
@Harris-工作顺利!
HadidAli

我希望此刻有类似的功能.toISODateString(),因为这种情况非常常见...
Lev Lukomsky 18/12/13

12

这是我只获取日期的方法:

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

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


2
据我所知,这是实际上提出split()想法作为答案的第一个答案,尽管我在所有可能的地方都使用moment(),但我还是比较喜欢这种解决方案来解决工作量,可靠性和有效因素的问题。
Rainabba '18

1
toISOString使用UTC,它将在本地时区从午夜开始偏移的时间段内产生错误的本地日期。– RobG
Michael Dimmitt

9

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是必须走的路。




4

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

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

我不知道为什么这次没有获得更多的选票,它运行得很好,并以最小的努力回答了这个问题
Wolfiebae,

4

在日期对象中传递您的日期:

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

1
toLocaleDateString()将以“ /”格式给出。不是“-”格式。
TechCrunch

您可以将以上内容用“ /”替换为“ /”。如果toLocaleDateString曾经更改过,则不是最优雅的方法
James Murphy

toLocaleDateString的结果并非对所有用户都一致,因此可能不会产生OP所需的结果。
RobG

4

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

ISO字符串具有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"

3

如果您有日期对象:

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)


1
toISOString使用UTC,它将在本地时区从午夜开始偏移的时间段内产生错误的本地日期。
RobG

1

扩展rk rk的解决方案:如果您希望格式包含时间,则可以在toTimeString()字符串中添加,然后剥离GMT部分,如下所示:

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

0

我用这个:

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/



0
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;

0

@Hozefa的更好答案。

如果已date-fns安装,则可以使用formatISO函数

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.