【问题标题】:Javascript: Compare dates in different GMT offsetsJavascript:比较不同 GMT 偏移量的日期
【发布时间】:2020-10-21 16:57:43
【问题描述】:

我有一个日期列表,需要在该列表中找到今天,但时区已关闭。当我使用 let d = new Date() 时,它返回 GMT-6,但日期列表在 GMT-7 中。我已经查看了所有内容,但无法找到如何获取 2 个日期以使 d1 == d2 返回 true。 这是在 Google 表格上,所以我知道我可以操纵表格和脚本的时区,但我想弄清楚这一点,以便脚本可以在不受语言环境影响的情况下运行。

表格https://docs.google.com/spreadsheets/d/1XKrH5AQSIGxJOWOzxT6OaI2ibn2kqeb9etyl5VGZu8M/edit#gid=0

function openToDate(){
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  let data = sh.getRange(1,1,sh.getLastRow()).getValues();
  let d = new Date();
  d.setHours(0,0,0,0);
  let d1 = d.toUTCString();
  let d2;
  Logger.log(d);
  Logger.log(d.getTime());
  Logger.log(d1);
  for (let i = 1; i < data.length; i=i+6){
    Logger.log(i);
    d2 = new Date(data[i][0]);
    Logger.log(d2);
    Logger.log(d2.getTime());
  }

【问题讨论】:

  • 将它们转换为与时区无关的格式,例如 UTC 日期或纪元时间戳。
  • @Abion47 我多次看到 .toISOString() 方法,但考虑到它将它转换为字符串,而不是日期对象,它失去了所有用处。有没有办法在保留日期的同时转换为 UTC?
  • 时区不应真正影响“核心”日期。由于日期相同,但时间不同,您可能会遇到问题。你能确认吗?
  • AFAIK 没有直接转换,但是一种快速而肮脏的方法是将toISOStringDate.parse 结合起来,或者使用getUTCX 函数来重建一个Date 对象。或者,我建议使用 moment 和 moment-timezone 包,但我不知道您在 Google 表格脚本中是否有该选项。
  • @Diego 是正确的:它们都显示 10/21/20,但一个是 GMT-6,另一个是 GMT-7

标签: javascript datetime google-apps-script google-sheets


【解决方案1】:

对于日期相等,您需要使用日期的数值。当您调用setHours() 时,它将返回调整日期的数值。如果您遇到时区问题,可以尝试使用setUTCHours()

function openToDate(){
  const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
  const data = sh.getRange(1,1,sh.getLastRow()).getValues();
  const today = (new Date()).setUTCHours(0,0,0,0);
  for (let i = 1; i < data.length; i=i+6){
    let d = (new Date(data[i][0])).setUTCHours(0,0,0,0);
    if (today == d) {
      Logger.log('MATCH!'); 
    }
  }
}

【讨论】:

    猜你喜欢
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多