【问题标题】:Javascript Date Now (UTC) in yyyy-mm-dd HH:mm:ss formatyyyy-mm-dd HH:mm:ss 格式的 Javascript 现在日期 (UTC)
【发布时间】:2021-07-28 18:18:25
【问题描述】:

我的大脑一定是彻底炸了,但我终其一生都无法弄清楚如何以 UTC 格式将当前日期和时间格式化为字符串。无论我做什么,我都只是本地化。

我有以下函数以正确的格式返回日期,但它始终是本地的。

let datenow = new Date;

console.log(datenow); // "2021-07-28T18:11:11.282Z"
console.log(generateDatabaseDateTime(datenow)); // "2021-07-28 14:11:33"

function generateDatabaseDateTime(date) {
  const p = new Intl.DateTimeFormat('en', {
    year:'numeric',
    month:'2-digit',
    day:'2-digit',
    hour:'2-digit',
    minute:'2-digit',
    second:'2-digit',
    hour12: false
  }).formatToParts(date).reduce((acc, part) => {
    acc[part.type] = part.value;
      return acc;
  }, {});

  return `${p.year}-${p.month}-${p.day} ${p.hour}:${p.minute}:${p.second}`;
}

有人知道我错过了什么吗?

【问题讨论】:

  • 只用date.getUTC<Year/Month/etc>?或date.toISOString().replace("T", " ").
  • 只需将timeZone:'UTC' 添加到选项中即可。

标签: javascript date datetime


【解决方案1】:

我们应该使用内置的toISOString 函数将其转换为 ISO 日期格式,并使用字符串操作删除不需要的数据。

let datenow = new Date();

console.log(datenow); // "2021-07-28T18:11:11.282Z"
console.log(generateDatabaseDateTime(datenow)); // "2021-07-28 14:11:33"

function generateDatabaseDateTime(date) {
  return date.toISOString().replace("T"," ").substring(0, 19);
}

理想的解决方案应该是使用 momentjs 或 dayjs 库。

【讨论】:

  • 谢谢!这正是我所需要的。我会使用 momentjs 或其他库,但对于我正在编写的这个简单脚本来说,这似乎有点过头了。
【解决方案2】:

一种简单的方法是从 new Date() 对象中获取每个 UTC 单位并创建所需的字符串。

const date = new Date();

const year = date.getUTCFullYear();
const month = String(date.getUTCMonth() + 1).padStart(2, '0'); // Month is 0-based
const day = String(date.getUTCDate()).padStart(2, '0');

const hour = String(date.getUTCHours()).padStart(2, '0');
const minute = String(date.getUTCMinutes()).padStart(2, '0');
const second = String(date.getUTCSeconds()).padStart(2, '0');
        
const strDate = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;

console.log(strDate);

添加 RobG 的宝贵建议,因为有时 cmets 会被删除:

稍微简单一点:new Date().toLocaleString('en-CA',{timeZone:'UTC', hour12:false}).replace(',','')

【讨论】:

  • 感谢您的回答并让我知道 padStart 存在。
  • @josh——稍微简单一点:new Date().toLocaleString('en-CA',{timeZone:'UTC', hour12:false}).replace(',','')。 :-0
  • 感谢@RobG 的宝贵建议。对于这个特定问题,我认为您的解决方案确实是最好的解决方案。事实上,我从编写已被接受的确切解决方案开始(尽管如此,你的仍然是最好的)但后来我改变了主意,我想这样写。我这样写的原因是,它可以灵活地以任何方式排列单元,例如dd/MM/yyyy HH:mm:ssMM/dd/yyyy HH:mm:ssyyyy-MM-dd'T'HH:mm:ss
【解决方案3】:

添加这个答案以及 RobG 建议的。

let datenow = new Date;

console.log(datenow); // "2021-07-28T18:11:11.282Z"
console.log(generateDatabaseDateTime(datenow)); // "2021-07-28 14:11:33"

function generateDatabaseDateTime(date) {
  const p = new Intl.DateTimeFormat('en', {
    year:'numeric',
    month:'2-digit',
    day:'2-digit',
    hour:'2-digit',
    minute:'2-digit',
    second:'2-digit',
    hour12: false,
    timeZone:'UTC'
  }).formatToParts(date).reduce((acc, part) => {
    acc[part.type] = part.value;
      return acc;
  }, {});

  return `${p.year}-${p.month}-${p.day} ${p.hour}:${p.minute}:${p.second}`;
}

【讨论】:

    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2013-11-01
    • 2020-03-07
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    相关资源
    最近更新 更多