如何将 JavaScript 日期转换为 ISO 字符串?

更新日期: 2024-01-11阅读: 173标签: 日期

如果您是一名 Web 开发人员,您必须知道如何使用 JavaScript 日期。该日期可帮助您管理网络上的事件、任务和操作。但是日期和时区可能很难处理,特别是如果您想使用 ISO 8601 这样的标准格式。如何将 JavaScript 日期转换为 ISO 字符串?

您可以使用 toISOString() 方法,该方法是 JavaScript 中 Date 对象的一部分。它为您提供一个以 ISO 8601 格式显示日期的字符串,如下所示:YYYY-MM-DDTHH:mm:ss.sssZ。T 分隔日期和时间,Z 表示时间采用 UTC(协调世界时)。

但是,如果您想更改 ISO 字符串,例如删除秒或更改时区,该怎么办?然后你需要做更多的工作,我将在本指南中向你展示。 

在本文中,我们将探讨:

  • 如何将日期转换为 ISO 格式字符串
  • 如何处理时区
  • 使用当前日期
  • 从 ISO 字符串中排除时区
  • 将 ISO 日期字符串转换为本地时间
  • 如何格式化 ISO 日期字符串
  • 将 ISO 日期字符串转换为特定格式
  • 如何处理时区偏移
  • 将 ISO 日期字符串解析为日期对象

让我们来探索一下。

将 JavaScript 日期转换为 ISO 字符串

在 JavaScript 中处理日期时,您通常需要以 ISO 8601 等标准化格式表示它们。ISO 字符串格式可确保不同系统之间的一致性和兼容性。JavaScript 提供了一个名为 的内置方法toISOString()来毫不费力地实现这种转换。

方法 1. 使用 toISOString() 方法

该toISOString()方法可用于 JavaScript Date 对象,并返回 ISO 8601 格式的日期字符串表示形式。

以下是如何在 JavaScript 中将新日期转换为 ISO 格式的示例:

const currentDate = new Date();
const isoString = currentDate.toISOString();
console.log(isoString);
// Output: 2023-08-18T02:57:08.020Z

在此代码中,currentDate使用当前日期和时间创建对象。toISOString()然后对该对象调用该方法,生成以下格式的 ISO 字符串:YYYY-MM-DDTHH:mm:ss.sssZ。

方法2:使用JSON.stringify()日期转iso字符串

该JSON.stringify()方法是将日期对象转换为 ISO 字符串的另一种方法。它返回一个与该方法格式相同的字符串toISOString(),但用双引号引起来。例如:
let date = new Date();
console.log(JSON.stringify(date));
// Output: "2024-01-04T03:38:48.891Z"

方法3:Intl.DateTimeFormat()方法

该Intl.DateTimeFormat()对象是将日期对象转换为 ISO 字符串的更高级、更强大的方法。它返回一个根据给定locale、options和自定义格式的字符串time zone。例如:

let date = new Date();
let options = {
  dateStyle: 'short',
  timeStyle: 'long',
  timeZone: 'Asia/Kolkata'
}

let formatter = new Intl.DateTimeFormat('sv-SE', options);
console.log(formatter.format(date));
// 2024-01-04 09:22:41 GMT+5:30

此方法不会返回时间组件的确切 ISO 格式字符串。此外,日期格式可能会根据区域设置而有所不同。


如果我们之前讨论的方法不适合您的情况,则自定义函数可以作为解决方案。这是一个如何编写的示例。

4.自定义ISO字符串转换

虽然toISOString()提供了标准的 ISO 字符串格式,但有时您可能需要不同的格式。在这种情况下,您可以手动构建类似 ISO 的字符串表示形式:

function customToISOString(date) {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');

  return `${year}-${month}-${day}`;
}

const currentDate = new Date();
const customIsoString = customToISOString(currentDate);
console.log(customIsoString);
// Output: 2023-08-18
在此示例中,该customToISOString()函数提取日期的year、month和day组成部分,以创建格式为 的自定义类 ISO 字符串YYYY-MM-DD。

处理时区

将 JavaScript ISO 字符串转换为日期

在处理日期时,处理时区至关重要,因为不同的用户和系统可能位于不同的时区。将 ISO 日期字符串转换为用户或系统的本地时间需要正确处理时区。

在此代码中,ISO 日期字符串首先转换为JavaScript Date对象。然后,该toLocaleString()方法用于根据用户或系统的时区将日期转换为本地日期和时间表示形式。

const isoDateString = "2023-08-17T12:00:00.000Z";
const date = new Date(isoDateString);
const localDateString = date.toLocaleString();
console.log(localDateString);
// Output: 8/17/2023, 5:30:00 PM

将时区信息添加到 ISO 字符串

要在 ISO 字符串中包含时区信息,可以使用该toISOString()方法。以下是创建带有时区的 ISO 字符串的方法:

const currentDate = new Date();
const isoWithTimezone = currentDate.toISOString();
console.log(isoWithTimezone);
// Output: 2023-08-18T02:59:34.205Z

生成的 ISO 字符串将包含时区信息:YYYY-MM-DDTHH:mm:ss.sssZ。


在 JavaScript 中将当前日期转换为 ISO 字符串

当您需要为事件或数据添加时间戳时,将当前日期转换为 ISO 字符串是一项常见任务。

const currentDate = new Date();
const isoString = currentDate.toISOString();
console.log(isoString);
// Output: 2023-08-18T03:00:23.917Z

该代码片段创建一个Date表示当前日期和时间的对象,然后使用该toISOString()方法将其转换为 ISO 字符串。

生成的 ISO 字符串将包含日期和时间部分。


从 ISO 字符串中排除时区

创建不带时区的 ISO 字符串

在某些情况下,您可能需要不带时区信息的 ISO 字符串。以下是实现这一目标的方法:

const currentDate = new Date();
const isoWithoutTimezone = currentDate.toISOString().slice(0, 19);
console.log(isoWithoutTimezone);
// Output: 2023-08-18T03:02:53

该toISOString()方法提供完整的 ISO 字符串,但使用JavaScript slice()仅提取日期和时间部分,而不提取时区信息。

日期转 ISO 字符串(不含时间)

要创建不带时间部分的 ISO 日期字符串,可以修改代码如下:

const currentDate = new Date();
const isoDateOnly = currentDate.toISOString().split('T')[0];
console.log(isoDateOnly);
// Output: 2023-08-18

通过在“T”字符处拆分 ISO 字符串并获取第一部分,您将获得不带时间的 ISO 日期。

此代码将为您提供 格式为 YYYY-MM-DD 的 ISO 日期字符串。

将 ISO 字符串转换为 JavaScript 日期

可以使用 来将 ISO 日期字符串转换为特定时区的本地时间toLocaleString()。以下是如何在 JavaScript 中将 ISO 字符串转换为日期的示例:

const isoDateString = "2023-08-18T12:00:00.000Z";
const date = new Date(isoDateString);

const options = { timeZone: 'America/New_York' };
const localDateString = date.toLocaleString('en-US', options);
console.log(localDateString);
// Output: 8/18/2023, 8:00:00 AM

在此示例中,选项对象指定目标时区。该toLocaleString()方法与 time zone 选项一起使用,将 ISO 日期字符串转换为指定时区的本地时间。

格式化 ISO 日期字符串

JavaScript 的 Date 对象不提供内置格式化选项,但您可以创建一个函数来根据需要格式化 ISO 日期字符串:

function formatISODate(isoDateString, format) {
  const date = new Date(isoDateString);
  const options = {
    year: 'numeric',
    month: 'short',
    day: 'numeric'
  };

  return new Intl.DateTimeFormat('en-US', options).format(date);
}

const isoDateString = "2023-08-18T12:00:00.000Z";
const formattedDate = formatISODate(isoDateString);

console.log(formattedDate);
// Output: Aug 18, 2023

在此代码中,该formatISODate()函数采用 ISO 日期字符串和格式字符串作为参数。然后,它将 ISO 日期字符串转换为 Date 对象,并使用该Intl.DateTimeFormat对象根据提供的格式设置日期格式。

不带秒和毫秒的 ISO 字符串

如果需要不带秒和毫秒的ISO字符串,可以修改toISOString()结果:

const currentDate = new Date();
const isoStringWithoutSeconds = currentDate.toISOString().slice(0, 16) + 'Z';
console.log(isoStringWithoutSeconds);
// Output: 2023-08-18T03:08Z

通过使用该slice (0, 16)方法,您可以删除秒和毫秒,然后添加“Z”来指示UTC时区。

将 ISO 日期字符串转换为本地日期

要将 ISO 日期字符串转换为本地Date对象,同时考虑时区:

function convertISOToLocalDate(isoDateString) {
  const date = new Date(isoDateString);
  const utcMilliseconds = date.getTime();
  const offset = date.getTimezoneOffset() * 60 * 1000;

  return new Date(utcMilliseconds + offset);
}

const isoDateString = "2023-08-18T12:00:00.000Z";
const localDate = convertISOToLocalDate(isoDateString);
console.log(localDate);
// Output: Fri Aug 18 2023 12:00:00 GMT+0530 (India Standard Time)

此函数根据 ISO 日期字符串计算 UTC 毫秒,添加时区偏移量(以毫秒为单位),并返回本地 Date 对象。

将 ISO 日期字符串转换为特定格式

如果需要将 ISO 日期字符串转换为特定格式,可以使用字符串操作和 Date 对象来实现:

function convertISOToSpecificFormat(isoDateString, format) {
  const date = new Date(isoDateString);

  const day = String(date.getDate()).padStart(2, '0');
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const year = date.getFullYear();

  return format
    .replace('dd', day)
    .replace('mm', month)
    .replace('yyyy', year);
}

const isoDateString = "2023-08-18T12:00:00.000Z";
const formattedDate = convertISOToSpecificFormat(isoDateString, 'dd/mm/yyyy');
console.log(formattedDate);
// Output: 18/08/2023

在此示例中,该convertISOToSpecificFormat()函数采用 ISO 日期字符串和格式字符串作为参数。格式字符串将替换为 Date 对象中相应的日、月和年值。

处理时区偏移

要将 ISO 日期字符串转换为本地 Date 对象,同时考虑时区偏移:

function convertISOToOffsetLocalDate(isoDateString, offsetMinutes) {
  const date = new Date(isoDateString);
  const utcMilliseconds = date.getTime();
  const offsetMilliseconds = offsetMinutes * 60 * 1000;

  return new Date(utcMilliseconds + offsetMilliseconds);
}

const isoDateString = "2023-08-18T12:00:00.000Z";
const localDate = convertISOToOffsetLocalDate(isoDateString, -240);
console.log(localDate);
// Output: Fri Aug 18 2023 13:30:00 GMT+0530 (India Standard Time)

在此代码中,该convertISOToOffsetLocalDate()函数接受 ISO 日期字符串和以分钟为单位的偏移量。然后,它通过将偏移量添加到 UTC 毫秒来计算本地日期。

带有时区偏移量的 ISO 日期字符串

要在 ISO 日期字符串中包含时区偏移量:

function getISOWithTimezoneOffset(date) {
  const offsetMinutes = date.getTimezoneOffset();
  const offsetHours = -Math.floor(offsetMinutes / 60);
  const offsetMinutesRemainder = Math.abs(offsetMinutes) % 60;
  const timezoneOffset = 
    `${offsetHours.toString().padStart(2, '0')}:${offsetMinutesRemainder.toString().padStart(2, '0')}`;

  return `${date.toISOString().slice(0, 19)}${timezoneOffset}`;
}

const currentDate = new Date();
const isoWithOffset = getISOWithTimezoneOffset(currentDate);
console.log(isoWithOffset);
// Output: 2023-08-18T03:15:2506:30

在此代码中,该getISOWithTimezoneOffset()函数计算时区偏移量(以小时和分钟为单位)并将其附加到 ISO 字符串。

将 ISO 日期字符串转换为本地时区

要将 ISO 日期字符串转换为用户设备的本地时区:

function convertISOToLocalTimezone(isoDateString) {
  const date = new Date(isoDateString);
  const localDate = new Date(date.getTime() + (date.getTimezoneOffset() * 60 * 1000));

  return localDate;
}

const isoDateString = "2023-08-18T12:00:00.000Z";
const localDate = convertISOToLocalTimezone(isoDateString);
console.log(localDate);
// Output: Fri Aug 18 2023 12:00:00 GMT+0530 (India Standard Time)

在此示例中,该convertISOToLocalTimezone()函数通过将时区偏移量与 UTC 毫秒相加来计算本地时间。

使用 moment.js 库

Moment.js是一个流行的 JavaScript 库,可以简化日期和时间操作。如果您更喜欢使用库来完成此类任务,Moment.js提供了一种使用 ISO 日期字符串的简单方法:

const isoDateString = "2023-08-17T12:00:00.000Z";
const formattedDate = moment(isoDateString).format('MMMM Do YYYY, h:mm:ss a');

console.log(formattedDate);

在此示例中,Moment.js 库用于解析 ISO 日期字符串,然后使用所需的模式对其进行格式化。

处理带有本地时区的 ISO 日期字符串

要将 ISO 日期字符串转换为具有用户本地时区的本地日期和时间:

const isoDateString = "2023-08-18T12:00:00.000Z";
const localDate = new Date(isoDateString);
console.log(localDate.toLocaleString());
// Output: 8/18/2023, 5:30:00 PM

在此代码中,该方法直接在JavaScript Date 构造toLocaleString()函数对象上使用,该对象负责使用用户的本地时区将 ISO 日期字符串转换为本地日期和时间表示形式。

将 ISO 日期字符串转换为特定格式和时区

要将 ISO 日期字符串转换为特定格式并将其调整为特定时区:

function formatDateTime(date, format, timeZone) {
  const options = {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZone: timeZone,
    timeZoneName: 'short'
  };

  const formatter = new Intl.DateTimeFormat('en-US', options);
  const parts = formatter.formatToParts(date);

  const formattedDate = format.replace(/(yyyy|MM|dd|HH|mm|ss|zzz)/g, match => {
    switch (match) {
      case 'yyyy': return parts.find(part => part.type === 'year').value;
      case 'MM': return parts.find(part => part.type === 'month').value;
      case 'dd': return parts.find(part => part.type === 'day').value;
      case 'HH': return parts.find(part => part.type === 'hour').value;
      case 'mm': return parts.find(part => part.type === 'minute').value;
      case 'ss': return parts.find(part => part.type === 'second').value;
      case 'zzz': return parts.find(part => part.type === 'timeZoneName').value;
      default: return match;
    }
  });

  return formattedDate;
}
如何使用这个方法呢?以下是如何使用此自定义方法的示例formatDateTime():
// Example usage:
const isoDateString = '2022-01-04T12:30:00Z';
const targetTimeZone = 'America/New_York';

// Your desired format string
const targetFormat = 'yyyy-MM-dd HH:mm:ss zzz';

const date = new Date(isoDateString);
const result = formatDateTime(date, targetFormat, targetTimeZone);

console.log(result);
// Output: 2022-01-04 07:30:00 EST

在此示例中,该formatDateTime()函数采用 ISO 日期字符串、目标格式字符串和目标时区。它根据提供的格式和时区转换和格式化日期。

将 ISO 日期字符串解析为日期对象

要解析 ISO 日期字符串并将其转换为 JavaScript Date 对象:

const isoDateString = "2023-08-18T12:00:00.000Z";
const dateObject = new Date(isoDateString);
console.log(dateObject);
// Output: Fri Aug 18 2023 17:30:00 GMT+0530 (India Standard Time)

在此代码中,只需使用 ISO 日期字符串作为参数创建一个新的 Date 对象,就会自动将其转换为 JavaScript Date 对象。

经常问的问题

结论

在本文中,您学习了如何使用 JavaScript Date 对象来创建和操作 ISO 字符串。ISO 字符串是以人类可读的格式表示日期和时间的标准化方式。每种方法都有其自身的优点和缺点,您应该选择适合您的需求和目标的方法。以下是一些可以帮助您做出决定的提示:

  • 如果您需要一种简单且一致的方法将日期对象转换为 ISO 字符串,请使用该toISOString()方法。
  • 如果需要将日期对象序列化为 JSON 格式,请使用该JSON.stringify()方法。
  • 如果您需要一种灵活且用户友好的方式将日期对象转换为 ISO 字符串,请使用该Intl.DateTimeFormat()对象。
  • 如果没有任何东西适合您的需要,您可以编写自定义函数。

通过使用 ISO 字符串,您可以确保日期和时间在不同平台和应用程序中保持一致且准确。

翻译来自:https://www.rajamsr.com/javascript-date-iso-string/

链接: https://www.fly63.com/article/detial/12635

解决javaScript在不同时区new Date()显示值不同问题

在日期格式化时遇到的问题,日期格式化方法在最下面。如果在中国时区 formatDate(‘2019-07-09‘) 结果是 ‘2019-07-09’,如果 在夏威夷时区 utc-10:00 或者别的时区 formatDate(‘2019-07-09‘) 结果是 ‘2019-07-08’

JS获取当前月的最后一天

为了更好的讲这节的内容,提示一个 JS 处理日期的小技巧,想获取上个月最后一天,只需要设置SetDate参数为0即可。使用 JS 获取当前月的最后一天,咱们通常的思路先获取下个月的第一天

Js如何获取某一天所在的星期?

我们这里来获取今天所在星期的始末日期,我们可以通过(new Date).getDay()来获取今天是星期几,然后再通过这个减去或者加上一定的天数,就是这个星期的开始日期和结束日期。

vue 循环取值日期格式化,字符串截取处理

用vue取值页面遍历时,每次都搜索js日期格式化和字符串长度截取,这次记录下来,以后从这里直接拿即可。html代码如下

js中Date的构造函数解读

javascript中的内置对象是我们经常会用到的,那么今天我们就来说说Date的四种构造方法吧,new Date()这是我们最常使用也最熟悉不过的Date对象的构造方法了,通过无参数的构造函数我们可以默认获取到一个代表实例化时的Date对象

js如何获取某一天所在的星期?

我们这里来获取今天所在星期的始末日期,我们可以通过(new Date).getDay()来获取今天是星期几,然后再通过这个减去或者加上一定的天数,就是这个星期的开始日期和结束日期。

ElementUI日期选择器时间选择范围限制

ElementUI是饿了么推出的一套基于vue2.x的一个ui框架。官方文档也很详细,这里做一个element-ui日期插件的补充。官方文档中使用picker-options属性来限制可选择的日期,这里举例子稍做补充。

js获取一段时间内的间隔日期

js获取指定时间范围内指定间隔天数的所有日期,前端js,已知开始时间a、结束时间b和间隔天数c,要求取在a-b这两个时间范围内、间隔c天的所有日期。

前端的各种日期操作

虽然现在处理日期方面已经有了很成熟的也很好用的库,例如(momentjs和date-fns),但是在实际开发中,我们有时候可能并不需要整个库。所以我就在下面整理了在前端开发时对日期时间的各种操作,也算是比较全的了

Safari Date() 函数对日期时间字符串(yyyy-MM-dd HH:mm:ss) 提示NaN的问题

今天发现一个奇怪的问题,在iPhone使用 safari 选择定时发布文章到OSC,选择时间后提示不是合法的时间,判断时间的代码如下:在Chrome下会输出 pass,在Safari会输出 isNaN,根据 ECMAScript 5 ISO-8601 format support: 的说法

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!