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

nee*_*raj 76 javascript date

如何从iso日期获得格式为yyyy-mm-dd的日期?

我的ISO日期是

2013-03-10T02:00:00Z
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到:

2013-03-10
Run Code Online (Sandbox Code Playgroud)

小智 110

只需裁剪字符串:

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

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

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);
Run Code Online (Sandbox Code Playgroud)

  • @Aida_Aida我能想到的唯一问题是,如果您的代码在未来至少8000年处理地理规模的时间,您的代码可能会破坏,因为格式在10000年将是"YYYYY-MM-DD".避免这种情况你可以拆分`T`字符.(参见https://en.wikipedia.org/wiki/Year_10,000_problem) (19认同)
  • 由于ISOString为UTC但Date对象为本地,因此这种方式将无法正确处理时区。您必须考虑到这一点。 (6认同)
  • @GuillaumeF。一个重要的考虑因素,但它确实符合OP的要求 (4认同)
  • 我认为这是他们所有人中最简单和最优雅的解决方案,但是这里有什么垮台吗? (3认同)
  • 我无法理解为什么应该将字符串解析为日期。*substring* 选项似乎是最简单的答案。 (2认同)

Mri*_*jay 77

试试这个

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

更新: -

正如评论中所指出的,如果需要,我正在更新打印日期和月份的前导零的答案.

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);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,我认为这不会在一天或一个月内打印出前导零 (14认同)
  • 同意@ user3413723这不回答问题,因为它删除了前导0因此不符合YYYY-MM-DD格式的要求 (2认同)
  • 您可以简单地使用“dt = dt.padStart(2, '0'));”和“month = Month.padStart(2, '0'));”,而不是两个 IF。 (2认同)
  • @Avatar 关闭,但这行不通。您的变量是数字,因此它们没有“padStart”函数。您必须首先使用`.toString()`。不管怎样,是的,我也会使用 `padStart` 将其变成漂亮的 oneliner :) 并不是说​​它在整数操作时不能变成 oneliner。 (2认同)

ant*_*129 26

您可以查看Moment.js,Luxon,date- fnsDay.js以获取日期操作.

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

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"
Run Code Online (Sandbox Code Playgroud)


小智 18

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
Run Code Online (Sandbox Code Playgroud)

  • d.toLocaleDateString('en-GB'); 奇迹般有效。很好的答案! (2认同)

nat*_*ter 13

与瑞典语言环境一起使用toLocaleDateString会返回 ISO 格式的日期。

function getISODate(date) {
    //return date.toLocaleDateString('fr-CA');
    return date.toLocaleDateString('sv-SE');
}
getISODate(new Date()); // '2022-03-24'

Run Code Online (Sandbox Code Playgroud)

PS 这曾经适用于加拿大“en-CA”区域设置,但现在至少自 2023 年 2 月起 Firefox 和 Chromium v​​110+ 使用美国日期格式。它仍然适用于加拿大“fr-CA”语言环境。不确定哪一个更适合未来。


Har*_*ris 12

Moment将为您处理日期格式.以下是如何通过javascript标记包含它,然后是如何使用时刻格式化日期的示例.

<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"
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码片段可能会解决问题,但 [包括解释](//meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您提出代码建议的原因。也请尽量不要在您的代码中添加解释性注释,因为这会降低代码和解释的可读性! (2认同)
  • `moment`是一个非常庞大的库,只用于格式化.而是使用[date-fns](https://date-fns.org/v1.28.5/docs/format),它的尺寸要小得多,并提供相同的功能. (2认同)

Ank*_*ita 7

用:

new Date().toISOString().substring(0, 10);
Run Code Online (Sandbox Code Playgroud)


Hoz*_*efa 7

date-fns是一个非常大的库,用于一个用例.建议formatting options改用.它提供了基本上最大的功能,'2013-03-10T02:00:00Z'.substring(0, 10);具有更小的捆绑尺寸和许多date-fns.

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

需要注意的一点是,由于其ISO时间格式浏览器通常会从UTC时间转换为本地时区.虽然这是一个简单的用例,你可以做date-fns.

对于更复杂的转换,还有formatting options很长的路要走.


小智 6

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

let date = new Date();
date = date.toISOString().slice(0,10);
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案无法正确处理时区,并且在许多情况下会导致意外的输出。 (2认同)

Ara*_*opi 6

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

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

alert(isoDate.split("T")[0]);
Run Code Online (Sandbox Code Playgroud)

  • 据我所知,这是实际上提出split()想法作为答案的第一个答案,尽管我在所有可能的地方都使用moment(),但我还是比较喜欢这种解决方案来解决工作量,可靠性和有效因素的问题。 (2认同)
  • toISOString 使用 UTC,这将针对本地时区从午夜偏移的时间段生成错误的本地日期。——罗布·G (2认同)

Joo*_*ook 6

对于所有使用 split、slice 和其他基于字符串的尝试来获取日期的人来说,您可能会为与时区相关的失败设置自己!

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"
Run Code Online (Sandbox Code Playgroud)


小智 6

最好的格式化方法是使用带有选项的 toLocaleDateString


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

Run Code Online (Sandbox Code Playgroud)

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

  • @aqm你可以用`en-GB`替换`en-EN`这个[SO链接](/sf/ask/223416511/)有其他区域设置及其短代码的列表 (2认同)

小智 5

将日期传递给日期对象.

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

  • *toLocaleDateString* 的结果对于所有用户来说并不一致,因此很可能不会产生 OP 所需的结果。 (2认同)