任何时区的用户都以太平洋时间输入日期

User in any time zone enters a date in Pacific Time

本文关键字:太平洋 时间 输入 日期 用户 任何时      更新时间:2023-09-26

好吧,也许我对此特别敏感。。。但我想知道如何让世界各地任何时区的用户使用时间选择器在太平洋时间输入时间,然后在保存后看到它在太平洋时间打印回他们(太平洋标准时间或太平洋标准时间,具体取决于)。让我们以纽约的某个人为例。我认为流程应该是这样的:

  1. 在输入字段中,此人选择"下午1点"(表示太平洋时间下午1点)
  2. JS将其读取为东部时间下午1点,并将其转换为UTC Unix时间戳
  3. UTC Unix时间戳已张贴到数据库
  4. 在显示结果中,时间戳被转换为太平洋时间。然而,你看,现在显然有一个问题,太平洋时间会读成"上午10点",因为张贴的时间戳是东部时间

如果我理解得很好,如果你能将你已经拥有的日期(从时间选择器构建)中的时区(无论是什么)更改为太平洋时间,你的问题就会得到解决。

使用即时时区,您可以通过以下操作来做到这一点:

function convertLocalToPst(localDate) {
  var pacific = moment().tz('US/Pacific');
  var m = moment(moment(d).utc().format("MM/DD/YYYY HH:mm"));
  m = pacific.isDST() ? m.utcOffset('-0800') : m.utcOffset('-0700');
  return m.toDate();    
}

基本上,您可以使用以下函数:

function convertUtcToPacificTime(utcDate) {
    var timezoneOffset = new Date().getTimezoneOffset();
    // set the time back 7 hours for PDT or 8 hours for PST
    // from the current utc date
    utcDate.setTime(utcDate.getTime()-(timezoneOffset/60)*3600*1000);
}

.getTimezoneOffset()以分钟为单位检索当前时区和UTC之间的差值,因此我要除以60。在PDT中,函数将返回420,而在PST 480中(当除以60时,分别为7和8)。

您的HTML选择框可能如下所示:

<select class="time-select">
   <option value="<!-- timestamp for 1 pm UTC -->">1 pm</option>
   <option value="<!-- timestamp for 2 pm UTC -->">2 pm</option>
   ...
</select>

一旦你得到了用户选择的时间戳,你就可以使用上面的函数进行转换:

$('.time-select').change(function() {
   var timestamp = $(this).val();
   var date = new Date(timestamp);
   if (!isNaN(date)) { // check if date is valid
       convertUtcToPst(date);
       // the 'date' var now contains
       // the PST date of the selected timestamp
       // post the timestamp to the DB  
   } else {
       // handle invalid date scenario
   }
});

此外,要计算UTC时间戳,只需对JS Date对象调用.getTime()