【问题标题】:How can I get DD-MM-YY hh:mm a, en-US, +0100 format using new Date() [duplicate]如何使用 new Date() 获取 DD-MM-YY hh:mm a, en-US, +0100 格式 [重复]
【发布时间】:2021-08-08 12:31:37
【问题描述】:

我想要这样的时间和日期格式

UK: 08-08-21 01:27 PM

SL: 08-08-21 05:57 PM

我试过这个。但我不能正常工作

this.subscription = timer(0, 60000)
      .pipe(
        map(() => new Date()),
        share()
      )
      .subscribe(time => {

        let day = new Date().getDay();
        let month = new Date().getMonth();
        let year = new Date().getFullYear();
        let SlHour = new Date().getHours();
        let UkHour = new Date().getUTCHours()+ 1;
        let minuts = new Date().getUTCMinutes();

        let SLTime = day + "-" + month + "-" + year + " " + UkHour + ":" + minuts
        let UKTime = day + "-" + month + "-" + year + " " + SlHour + ":" + minuts
     }

谁能帮我搞定这种格式

英国:08-08-21 01:27 PM

SL:08-08-21 05:57 PM

【问题讨论】:

  • 请用更具体的技术术语定义“无法正常工作”。换句话说....什么按预期工作或没有按预期工作?

标签: javascript typescript date time


【解决方案1】:

尝试格式化日期分隔符-

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Static Template</title>
</head>

<body>
  <div>
    UK:
    <h4 id="app-uk"></h4>
  </div>
  <div>
    SL:
    <h4 id="app-sl"></h4>
  </div>

  <script>
    let now = new Date();

    let formatDateUK = now.toLocaleString("en-UK", {
      dateStyle: "short",
      timeStyle: "short",
      hour12: true
    });

    let formatDateSL = now.toLocaleString("en-SL", {
      dateStyle: "short",
      timeStyle: "short",
      hour12: true
    });

    let displayDateUK = document.querySelector("#app-uk");
    displayDateUK.innerHTML = formatDateUK;

    let displayDateSL = document.querySelector("#app-sl");
    displayDateSL.innerHTML = formatDateSL;
  </script>
</body>

</html>

【讨论】:

  • 在 Safari 中的英国,我会在 21 年 8 月 9 日早上 6 点 51 分获得,鉴于现在是 8 月 9 日,这可能是出乎意料的。
【解决方案2】:

我写了一个formatDate 函数。如果ukTime 为真,则结果为伦敦时间,如果为假,则为当地时间。这应该适合您的目的。

英国时间是使用 date-string-date 方法生成的,因为小时加 1 会导致时间无效。

编辑:固定 00AM 到 12AM。

function formatDate(ukTime = false) {
    let dt;
    if (ukTime) dt = new Date(new Date().toLocaleString("en-US", { timeZone: "Europe/London" }));
    else dt = new Date();

    let dayStr = dt.getDate().toString().padStart(2, "0"),
        monthStr = (dt.getMonth() + 1).toString().padStart(2, "0"),
        yearStr = dt.getYear().toString().substring(1, 3);
    let hour = dt.getHours() > 12 ? dt.getHours() - 12 : (dt.getHours() == 0 ? 12 : dt.getHours());
    
    return `${dayStr}-${monthStr}-${yearStr} ${hour.toString().padStart(2, "0")}:${dt.getMinutes().toString().padStart(2, "0")} ${dt.getHours() >= 12 ? "PM" : "AM"}`;
}


console.log(formatDate(true))
console.log(formatDate(false))

【讨论】:

  • 谢谢。但我希望时间应该每分钟更新一次。
  • 如果你想更新,做一个经常运行的函数并使用formatDate更新时间。
  • 考虑let hour = dt.getHours() % 12 || 12
  • dt = new Date(new Date().toLocaleString("en-US", { timeZone: "Europe/London" })); 中创建字符串然后解析它以创建时区偏移日期的策略存在缺陷,因为它依赖于解析 toLocaleSring 输出的内置解析器 i> 当不需要这样做时(在很多情况下也不会这样做)并且它可能会生成一个在本地不存在或在 DST 转换期间存在两次的时间。最好将 formatToParts 与适当的 IANA 位置一起使用。
  • 感谢您告诉我,这可能会更好。
【解决方案3】:

代码中有很多错误:

let day = new Date().getDay();

返回日期编号(星期日 = 0、星期一 = 1 等)而不是日期

let month = new Date().getMonth();

返回 Jan = 0、Feb = 1 等的月份索引,因此您需要加 1 以获取日历月份编号。

let UkHour = new Date().getUTCHours()+ 1;

这假定英国时间始终为 UTC +1,但事实并非如此,并且当小时应为 0 时也将返回 24。

代码每次还要创建一个新的 Date 对象,效率低下。要获取特定位置的日期和时间,请使用Intl.DateTimeFormat constructortimeZone 选项,该选项也可通过toLocaleString 获得。

由于日期和时间的本地化格式未标准化,您可以使用 formatToParts 方法将日期的各个部分作为对象数组返回,其中每个部分都有名称和值。然后您可以可靠地格式化零件,例如假设“SL”表示“标准本地”:

// Format date as DD/MM/YY h:mm AP
function formatDate(date = new Date(), location) {
  // Standard options
  let opts = {
    day: '2-digit',
    month: '2-digit',
    year: '2-digit',
    hour: 'numeric',
    minute: '2-digit',
    second: '2-digit',
    hour12: true
  };
  // Add timezone if supplied
  if (location) {
    opts.timeZone = location;
  }
  // Create a formatter  
  let f = new Intl.DateTimeFormat('en', opts);
  // Get the parts
  let {year, month, day, hour, minute, dayPeriod} = f.formatToParts(date).reduce(
    (acc, part) => {
      acc[part.type] = part.value;
      return acc
    }, {}
  );
  // Return formatted string
  return `${day}-${month}-${year} ${hour}:${minute} ${dayPeriod.toUpperCase()}`;
}

console.log('UK (London): ' + formatDate(new Date(), 'Europe/London'));
console.log('Vladivostok: ' + formatDate(new Date(), 'Asia/Vladivostok'))
console.log('Local      : ' + formatDate());

DD-MM-YY 格式不明确,不仅是因为美国偏爱 M/D/Y,还因为许多地方使用 Y-M-D,因此 01-02-03 可能会被解释为 3 种不同的方式。最好使用短月份名称来避免这种情况,例如21 年 8 月 9 日。四位数年份也会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 2023-04-06
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多