如何解析 javascript 中的日期?

How to parse dates in javascript?

如何在纯 javascript 中解析此示例格式 7 July 2021 at 1:36:23 AM Z 中的日期?即使使用 moment.js 也尝试了很多东西,但没有成果。我认为日期中间的 at 是问题所在。任何帮助,将不胜感激。提前致谢

编辑:

尝试了评论中提到的 replace() 功能,它对 chrome 非常有效,但 safari 会抛出 Invalid Date 错误。

示例代码:

function convertUTCDateToLocalDate(date) {
    let newDate = new Date(date);
    let options = {
        year: "numeric",
        month: "long",
        day: "2-digit",
        hour: '2-digit',
        minute: '2-digit',
        second: '2-digit'
    };
    return newDate.toLocaleDateString("en", options);
}
let dateString = "7 July 2021 at 1:36:23 AM Z"
console.log(convertUTCDateToLocalDate(dateString.replace('at', ''));

您可以为 Safari 使用替换正则表达式 dateString.replace(/at|Z/g, ''),它适用于 Safari 和 Chrome

最好的选择是从您的字符串的来源请求 ISO 8601 格式的日期时间。也许有一个 API 选项允许您传递格式。如果您使用的是一些自定义输入,则可能还有一个选项可以检索 ISO 8601 格式的字符串。


如果由于某种原因您无法在源代码处更改字符串,您始终可以手动将其转换为正确的格式。

const months = {
  january: 1,
  february: 2,
  march: 3,
  april: 4,
  may: 5,
  june: 6,
  july: 7,
  august: 8,
  september: 9,
  october: 10,
  november: 11,
  december: 12,
};
const meridiems = {
  am: 0,
  pm: 12,
};

const input = "7 July 2021 at 1:36:23 AM Z";
let [day, month, year, _at, time, meridiem, offset] = input.split(" ");
let [hour, minute, second] = time.split(":");

day = day.padStart(2, "0");

month = months[month.toLowerCase()];
month = month.toString().padStart(2, "0");

hour = hour % 12 + meridiems[meridiem.toLowerCase()];
hour = hour.toString().padStart(2, "0");

const iso8601 = `${year}-${month}-${day}T${hour}:${minute}:${second}${offset}`;

console.log(iso8601);
console.log(new Date(iso8601));

一个简单的解析器,假设偏移量总是 Z:

// Parse timestamp in format "7 July 2021 at 1:36:23 AM Z"
function parseTS(ts) {
  ts = ts.toLowerCase();
  let months = ['jan','feb','mar','apr','may','jun',
                'jul','aug','sep','oct','nov','dec'];
  let [D, M, Y, x, h, m, s, ap, os] = ts.split(/\W/);
  return new Date(Date.UTC(Y, months.indexOf(M.substr(0,3)), D,
    h%12 + (ap == 'pm'? 12 : 0), m, s)); 
}

['7 July 2021 at 1:36:23 AM Z',
 '7 July 2021 at 1:36:23 PM Z'
].forEach(ts => console.log(`${ts} : ${parseTS(ts).toISOString()}`));

如果你想使用 moment.js,你应该总是 provide the format using tokens as for formatting unless it's a supported format。 “at”可以用方括号省略:

// 7 July 2021 at 1:36:23 AM Z
let d = moment('7 July 2021 at 1:36:23 AM Z', 'D MMMM, YYYY [at] h:mm:ss a Z');

console.log(d.toString());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>