如何使用Javascript Date对象计算东部时间?

6
我正在处理一个涉及JavaScript的个人项目,作为该项目的一部分,我想获取当前日期(包括时间)并相应地显示它。没什么大不了的,对吧?那么问题是,我想以东部夏令时的形式返回时间和日期,无论IP在世界上哪里。
如果这不可能,你有什么替代方法建议吗?PHP是否具备此功能?我可以编写一个简单的PHP脚本来获取并转换日期,但如果可能的话,我想将其保留在JS中。
我正在思考最佳方法,但我会感激您提供的任何帮助。
谢谢!
3个回答

7

我在互联网上找到了这篇文章,而且还有很多类似的脚本:

function calcTime(offset) {

    // create Date object for current location
    d = new Date();

    // convert to msec
    // add local time zone offset 
    // get UTC time in msec
    utc = d.getTime() + (d.getTimezoneOffset() * 60000);

    return new Date(utc + (3600000*offset));

}

因此,您获取当前时间,添加当前位置的偏移量以获取UTC时间,然后返回一个新日期,在其中再次添加某个时区的偏移量。


谢谢,你的回答完全有效,但我越想,我越觉得我会使用PHP来进行日期格式化。 :) - Alex
4
请注意,如果您想考虑到夏令时,从协调世界时转换为“东部时间”有点棘手。 - Eli

1

JavaScript原生Date对象只知道两个时区,即UTC和用户的本地时区(即使是这样,您可以提取有关本地时区的信息量也很有限)。您可以在UTC中工作并减去4小时以获取EDT,但您真的总是想要EDT而不是EST吗?

如果您想在PHP之间进行任意区域的时区转换,则需要拖入一个带有自己时区信息的大型库,例如TimezoneJS

最好将JavaScript内容全部保留在UTC中,并让PHP端为特定的语言环境/时区格式化它,例如使用Date/Time中的时区内容。


0

检查给定日期是否在复活节日。如果没有给定日期,则使用当前日期。

// If dateObject == null, current Datetime will be used.
// This function uses the "Meeus/Jones/Butcher" algorithm
function isEaster(dateObject) {
  const date = dateObject ?? new Date();
  const year = date.getFullYear();

  // Calculate the date of good friday for the current year
  const a = year % 19;
  const b = Math.floor(year / 100);
  const c = year % 100;
  const d = Math.floor(b / 4);
  const e = b % 4;
  const f = Math.floor((b + 8) / 25);
  const g = Math.floor((b - f + 1) / 3);
  const h = (19 * a + b - d - g + 15) % 30;
  const i = Math.floor(c / 4);
  const k = c % 4;
  const l = (32 + 2 * e + 2 * i - h - k) % 7;
  const m = Math.floor((a + 11 * h + 22 * l) / 451);
  const n = Math.floor((h + l - 7 * m + 114) / 31) - 1;
  const p = (h + l - 7 * m + 114) % 31;

  // Calculate the easter dates
  const maundyThursday = new Date(year, n, p - 1);
  const goodFriday = new Date(year, n, p);
  const holySaturday = new Date(year, n, p + 1);
  const easterSunday = new Date(year, n, p + 2);
  const easterMonday = new Date(year, n, p + 3);

  return ([maundyThursday, goodFriday, holySaturday, easterSunday, easterMonday].map(elem => {
    return elem.toISOString().split('T')[0];
  }).indexOf(date.toISOString().split('T')[0]) > -1);
}

此功能使用“Meeus/Jones/Butcher”算法。 - SYNAIKIDO
我的错,我在标题中读成了“复活节”时间而不是“东部”时间... - SYNAIKIDO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接