如何在JavaScript中从ISO 8601时间格式获取时间?

5

这是我的ISO格式日期。我想要在JavaScript中获取类似“11:00”的时间。 我使用了以下方法:

new Date(Mydate).toLocaleString();

但它给出的时间是“16:30”。在JavaScript中有没有格式或方法可以做到这一点?如何仅获取该时区的时间。

var Mydate = "2012-10-16T11:00:28.556094Z";

输出结果将是“11:00”。
7个回答

8

现代方法,使用内置于Node.js和大多数现代浏览器中的ECMAScript国际化API:

const myDate = "2012-10-16T11:00:28.556094Z";
const time = new Date(myDate).toLocaleTimeString('en',
                 { timeStyle: 'short', hour12: false, timeZone: 'UTC' });

// Output:  "11:00"

使用较旧的方法,需要使用moment.js

var myDate = "2012-10-16T11:00:28.556094Z";
var time = moment.utc(myDate).format("HH:mm");

// Output:  "11:00"

1
@BerkerYüceer - 原始答案是在2013年编写的。我更新了它,展示了不需要Moment的现代方法。谢谢。 - Matt Johnson-Pint

2
请使用以下内容:
var date = new Date(Mydate);
var time = ConvertNumberToTwoDigitString(date.getUTCHours()) + 
           ":" + ConvertNumberToTwoDigitString(date.getUTCMinutes());

// Returns the given integer as a string and with 2 digits
// For example: 7 --> "07"
function ConvertNumberToTwoDigitString(n) {
    return n > 9 ? "" + n : "0" + n;
}

谢谢您的回复。但是这里的输出是16:30,我需要得到“11.00”。 - user2901979
然后使用 getUTCHours()getUTCMinutes() - RononDex
1
使用这种方法,您还需要用零填充分钟。 - Matt Johnson-Pint
@user2901979 更新了我的回答 - RononDex

1

试试这个,我忘记从哪里得到的:

// --- Date ---
// convert ISO 8601 date string to normal JS Date object
// usage: (new Date()).setISO8601( "ISO8601 Time" )

Date.prototype.setISO8601 = function(string) {
  var d, date, offset, regexp, time;
  regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" + 
           "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" + 
           "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
  d      = string.match(new RegExp(regexp));
  offset = 0;
  date   = new Date(d[1], 0, 1);
  if (d[3])  date.setMonth(d[3] - 1);
  if (d[5])  date.setDate(d[5]);
  if (d[7])  date.setHours(d[7]);
  if (d[8])  date.setMinutes(d[8]);
  if (d[10]) date.setSeconds(d[10]);
  if (d[12]) date.setMilliseconds(Number("0." + d[12]) * 1000);
  if (d[14]) {
    offset = (Number(d[16]) * 60) + Number(d[17]);
    offset *= (d[15] === '-' ? 1 : -1);
  }
  offset -= date.getTimezoneOffset();
  time = Number(date) + (offset * 60 * 1000);
  return this.setTime(Number(time));
};

1

请注意,toLocaleTimeString 的旧实现可能会根据浏览器的不同实现而表现出不同的行为。

日期:2021年9月9日

locales 和 options 参数可自定义函数的行为,并允许应用程序指定应使用哪些语言格式约定。在忽略 locales 和 options 参数的旧实现中,返回的 locales 和字符串形式将完全依赖于实现。

我最近使用的实现:

function getTimeFromISODateString(isoDateString) {
  const date = new Date(isoDateString);
  const hours = `0${date.getUTCHours()}`.slice(-2);
  const minutes = `0${date.getUTCMinutes()}`.slice(-2);
  const seconds = `0${date.getUTCSeconds()}`.slice(-2);
  return `${hours}:${minutes}:${seconds}`;
}

1

尝试使用以下代码从ISO日期中获取时间。

let Mydate = '2012-10-16T11:00:28.556094Z';
let result = Mydate .match(/\d\d:\d\d/);
console.log(result[0]);

输出将是:

11:00

0

0

如果您不需要使用时区,请使用此选项来分隔日期和时间

const separateDateTime = (dateTime: string) => {
    const date = dateTime.split("T")[0];
    const time = dateTime.split("T")[1].split(".")[0]
    return { date, time };
  }

// how to use it
const myDate = "2012-10-16T11:00:28.556094Z";
const dateTimeObj = separateDateTime(myDate)

console.log(dateTimeObj.time)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接