当前位置: 首页 > 知识库问答 >
问题:

如何在Javascript中将(年、月、日)转换为扩展的年日期格式,并处理0到99年

漆雕奇逸
2023-03-14

ECMA-262 语言规范第 21.4.1.15.1 段详细介绍了扩展年份日期格式

引述:

21.4.1.15.1 扩展年份

涵盖1970年1月1日(21.4.1.1)前后约273,790年的全时值范围需要表示0之前或9999之后的年份。ISO 8601允许扩展年份表示。

在简化的ECMAScript格式中,这种扩展的年份表示应具有6位数字,并且始终以或符号作为前缀。0年被视为正,因此以符号作为前缀。

注意带有扩展年份的日期时间值示例:

-271821-04-20T00:00:00Z===

-000001-01-01T00:00:00Z ===

000000-01-01T00:00:00Z ===

000001-01-01T00:00:00Z===

001970-01-01T00:00:00Z===

002009-12-15T00:00:00Z===

275760-09-13T00:00:00Z===

我尝试了以下Javascript日期方法将(年、月、日)转换为相应的扩展年日期格式:

const date = new Date(30,11,20);
console.log(date.toString());           // "Sat Dec 20 1930 00:00:00 GMT+0400 (Arabian Standard Time)"
console.log(date.toISOString());        // "1930-12-19T20:00:00.000Z"
console.log(date.toDateString());       // "Sat Dec 20 1930"
console.log(date.toGMTString());        // "Fri, 19 Dec 1930 20:00:00 GMT"
console.log(date.toUTCString());        // "Fri, 19 Dec 1930 20:00:00 GMT"
console.log(date.toLocaleDateString()); // "12/20/1930"

以上所有Date()方法都不能将(年、月、日)转换为“扩展年日期”格式。它们还将0到99之间的任何一年转换为1900到1999年。

作为一种可能的解决方案,我生成了以下一行代码,试图找到一种方法:

const expandedDate=(Y, M, D)=>(Y<0?"-":"+")+("00000"+Math.abs(Y)).slice(-6)+"-"+("0"+M).slice(-2)+"-"+("0"+D).slice(-2);

然而,我认为这种将日期转换成字符串,然后将字符串分割成多个部分的方法并不是我所说的最佳方法。

有没有更好/更简单的方法作为Javascript内置方法或另一种方法将(年,月,日)格式转换为相应的扩展年份日期格式?

const expandedDate=(Y, M, D)=>(Y<0?"-":"+")+("00000"+Math.abs(Y)).slice(-6)+"-"+("0"+M).slice(-2)+"-"+("0"+D).slice(-2);

console.log(expandedDate(30,11,20));
console.log(expandedDate(2022,11,20));
console.log(expandedDate(-30,11,20));
console.log(expandedDate(-3200,11,20));
console.log(expandedDate(0,11,20));
console.log(expandedDate(-271821,4,20));

共有3个答案

羊舌诚
2023-03-14

Javascript中有一个内置函数,可以生成扩展的日期格式date.toISOString()

    const mydate = new Date(-5, 12, 31);
    console.log(mydate.toISOString());
霍修筠
2023-03-14

比你的代码多得多,也冗长得多。但是可能更容易理解。

function paddingZero(num, digit) {
  const toAdd = digit - num.length;
  let padding = "";
  for (let index = 0; index < toAdd; index++) {
    padding += "0";
  }
  return padding + num; 
}

function expandedDate({ year, month, day }) {
  const yyyyyy = paddingZero(Math.abs(year).toString(), 6);
  const mm = paddingZero(month.toString(), 2);
  const dd = paddingZero(day.toString(), 2);
  const prefix = year < 0 ? "-" : "+";
  return `${prefix}${yyyyyy}-${mm}-${dd}`;
}

console.log(expandedDate({ year: 30, month: 11, day:20}));
console.log(expandedDate({ year: 2022, month: 11, day: 20}));
console.log(expandedDate({ year: -30, month: 11, day: 20}));
console.log(expandedDate({ year: -3200, month: 11, day: 20}));
console.log(expandedDate({ year: 0, month: 11, day: 20}));
console.log(expandedDate({ year: -271821, month: 4, day: 20}));
狄心水
2023-03-14

构造函数将0到99之间的年份值视为1900年,这是一个遗留特性,在实现临时对象之前,没有解决这个问题(这可能在ECMAScript 2023中,因为它似乎即将出现,但它不在最新的ECMA-262 2022草案中)。

至于格式化,ECMAScript对日期的格式化支持非常有限,这就是为什么有这么多日期库的原因。您可以组合使用现有的格式化方法,也可以创建一个全新的格式化方法。

例如,如果只需要正年份,那么您可以利用toLocaleDateString:

console.log(
  new Date()
      .toLocaleDateString('en-CA')
      .replace(/^(.\d+)/,y => (y<0? '-' : '+')+(''+Math.abs(y))
      .padStart(6,'0'))
);
 类似资料:
  • 问题内容: 我正在尝试将字符串转换为日期 但在我看来,它有一个。的。这是为什么?我想生成一个日期 问题答案: 日期字符串- 符合- d-每月的某天 M-一年中的月份 y-年 …

  • 问题内容: 我正在使用模块,即: 我想计算考虑takes年的一年中的某天。例如今天(2009年3月6日)是2009年的第65天。 我看到两个选择: 创建一个数组,确定是否是a年,然后手动汇总天数。 用于猜测,然后二进制搜索一年中的正确日期: YEAR = 2009 DAY_OF_YEAR = 62 d = datetime.date(YEAR, 1, 1) + datetime.timedelta

  • 我有一个日值(1-31)、一个月值(1-12)和一个年值,我需要将它们保存为我的MySQL数据库日期格式。 如何将这些值(对应于日、月和年的3个整数)转换为日期格式以将其保存到数据库中?

  • 我正在使用管道来格式化我的日期,但如果没有解决方法,我就无法获得我想要的确切格式。我是误解了管道还是根本不可能? PLNKR视图

  • 如果在程序中有人给我天数(ab=“days”),我需要将变量“days”设置为相同的数字(“val”中的值),如果有人给我月份(ab=“months”),那么我需要将其转换为天(val中的值),如果有人给我年(ab=“years”),那么我需要将其转换为天(val中的值)。ie如果用户在变量“ab”中指定了值的类型(即是月、年或日期)和变量“val”中的天数(天/月/年),我需要在变量“天”中获得

  • 我必须将数据帧从当前格式转换为新格式(见下图或结构)。我不知道我怎样才能做到这一点。我希望每个ID有一年,从2013年到2018年(因此每个ID有6行,每年一行)。日期是居住在该地址的日期(进入日期)和离开该地址的日期(结束日期)。因此,每个ID和年份都给出了他们居住的zipcode和城市。ID(每年)居住的地方应该是他们在那一年居住的时间最长的地方。我已经将截止日期设置为2018年12月31日,