Google 电子表格中的时区转换

Timezone conversion in a Google spreadsheet

我知道这看起来很简单。

在 Google 电子表格中,我有一列输入一个时区 (GMT) 的时间 另一列应该自动获取另一个时区的时间(太平洋时间)

 GMT      | PT
----------|------------
 5:00 AM  | 9:00 PM

截至目前,我正在使用

 =$C-time(8,0,0)

这里的问题是,我想更改夏令时的时间公式。

有没有自动计算夏令时的函数或脚本

简答

没有内置函数,但您可以构建自定义函数。

例子

/**
 * Converts a datetime string to a datetime string in a targe timezone.
 *
 *@param {"October 29, 2016 1:00 PM CDT"} datetimeString Date, time and timezone.
 *@param {"Timezone"} timeZone Target timezone
 *@param {"YYYY-MM-dd hh:mm a z"} Datetime format
 *@customfunction
 */
function formatDate(datetimeString,timeZone,format) {
  var moment = new Date(datetimeString);
  if(moment instanceof Date && !isNaN(moment)){
    return Utilities.formatDate(moment, timeZone, format)
  } else {
    throw 'datetimeString can not be parsed as a JavaScript Date object'
  }
}

注意:

new Date(string) / Date.parse(string) Google Apps 脚本中的实现不支持某些时区缩写。

来自https://tc39.es/ecma262/#sec-date-time-string-format

There exists no international standard that specifies abbreviations for civil time zones like CET, EST, etc. and sometimes the same abbreviation is even used for two very different time zones.

相关


说明

为了考虑夏令时区,要转换的值的输入参数应包括日期,而不仅仅是一天中的时间。您可以设置默认日期和时区,通过在调用公式之前连接它来构建 datetimeString。

=formatDate("October 29, 2016 "&A2&" GMT","PDT","hh:mm a")

对于目标时区,除了三个字母的缩写,我们还可以使用 TZ database names,例如 America/Los_Angeles,例如:

=formatDate("October 29, 2016 "&A2&" GMT","America/Los_Angeles","HH:mm")

如果 datetimeString 使用时间偏移(即 UTC-4)时区缩写和 TZ 名称失败。

另见

  • Calculating year, month, days between dates in google apps script

参考资料

不用宏也可以做到。只需使用函数和数据操作就足够了。在这里解释整个过程会有点麻烦。只需研究各种时间函数的工作原理并发挥您的创造力即可。

提示:如果您需要当前日期和时间,请使用 =NOW()。如果您需要找出不同日期之间的精确时间差异,您实际上需要它。

当您只需要时间时使用 =NOW()-INT(NOW())(如果两个时间都在同一日期,则日期会被截断)。然后为时间格式化相应的一个或多个单元格(即 4:30 PM),而不是日期时间(3/25/2019 17:00:00)。后者是您想要同时显示日期和时间时使用的格式...就像您使用 NOW().

还可以在线搜索各种标准时区(PT、MT、CT、ET、AT)相对于协调世界时 (UTC) 的夏令时偏移量。例如,在 2019 年,当从 3 月 10 日凌晨 2 点(太平洋时间)开始到 11 月 3 日凌晨 2 点观察到 DST 时,太平洋时间的偏移量是 UTC-7。这意味着从 UTC 到 Pacific 的时差是 7 小时。在一年中的其余时间是 8 小时 (UTC-8)。在 3 月某个时候(今年 10 日)开始的夏令时期间,通过将时钟向前移动 1 小时,或我们所知的 UTC-7(即夏令时),它从 PST 变为 PDT。在遵守 DST 之后,通过再次将时钟向后移动 1 小时,或者我们所知的 UTC-8(或冬令时),它从 PDT 变为 PST。请记住,时钟在 3 月提前一小时,以便更好地利用时间。这就是我们所说的 DST,即夏令时。因此,在 3 月 8 日凌晨 2 点(今年是 2019 年)之后,我们处于 UTC-7。 11 月,我们反其道而行之。 11 月 3 日凌晨 2 点,随着冬天的到来,时钟将拨回一小时。此时我们回到标准时间。好像有点乱,其实不然。

所以,基本上,对于 PT 的人来说,他们在 3 月从 PST 转到 PDT,在 11 月从 PDT 转到 PST。山地时间、中部时间和东部时间的过程完全相同。但它们有不同的 UTC 时间偏移量。 MT 是 UTC-6 或 UTC-7。 CT 是 UTC-5 或 UTC-6。 ET 是 UTC-4 或 UTC-5。这一切都取决于我们是在观察夏令时以更好地利用日光和工作时间的夏季时间,还是在冬季时间(又名标准时间)。

彻底研究这些并了解它们的工作原理,并在 Excel 或 Google 表格中尝试各种时间函数,例如 TIME(#,#,#)NOW() 函数和这样,相信我,很快您就可以使用简单的函数像专业人士一样做任何事情,而无需使用 VBA Google Apps 脚本。不过,您也可以使用 TEXT() 函数,使用 =TEXT(L4,"DDD, MMM D")&" | "&TEXT(L4,"h:mm AM/PM") 等技巧,其中 L4 包含日期时间戳,以显示时间和日期格式。 VALUE() 函数也时常派上用场。您甚至可以在不使用宏的情况下设计一个数字倒数计时器。为此,您需要在电子表格设置中创建一个循环引用并将迭代次数设置为 1,并将时间显示设置为每 1 分钟一次。

官方 timeanddate.com 网站是一个很好的信息来源,让所有人了解时区以及如何处理夏令时。他们那里也有所有 UTC 偏移量。

本教程非常有用:https://davidkeen.com/blog/2017/01/time-zone-conversion-in-google-sheets/

Google Sheets does not have a built in way of converting time zone data but by using the power of Moment.js and Google’s script editor we can add time zone functionality to any sheet.

这些是我复制到脚本项目中的文件:

确保先添加 moment.js 脚本并将其放在 moment-timezone.js 脚本之上,因为 moment-timezone.js 依赖于它。

然后在您的 other 脚本项目中,您的 Code.gs 文件可以如下所示:

var DT_FORMAT = 'YYYY-MM-DD HH:mm:ss';

/**

*/
function toUtc(dateTime, timeZone) {  
  var from = m.moment.tz(dateTime, DT_FORMAT, timeZone);//https://momentjs.com/timezone/docs/#/using-timezones/parsing-in-zone/
  return from.utc().format(DT_FORMAT);
}

/**

*/
function fromUtc(dateTime, timeZone) {
  var from = m.moment.utc(dateTime, DT_FORMAT);//https://momentjs.com/timezone/docs/#/using-timezones/parsing-in-zone/
  return from.tz(timeZone).format(DT_FORMAT);
}

在 Google 工作表中创建您自己的时区转换器:

第 1 步: Create your table for the timezone converter.

第 2 步: Enter the times for your time zones in a column. 注意:确保您 select date/time format(Select Cell(s) -> Format -> Number -> Time/Date)

第 3 步:使用以下函数编写一个转换时区的公式 Google Sheet Functions

=HOUR(A8)+(B3*C3) converts the hours.
=MINUTE(A8)+(B3*C3) converts the minutes.

第 4 步: 使用 TIME(h,m,s) 函数转换回时间格式

=TIME(HOUR(A8)+(B3*C3), MINUTE(A8)+(B3*C3), SECOND(A8))

这是一种转换时区的简单方法。 但是,如果你想实现一个准确的时区转换器来处理前一天、第二天以及超过 24 小时、超过 60 分钟,请使用 MOD 操作并处理所有情况。 访问(或使用)此 google sheet 以供参考: https://docs.google.com/spreadsheets/d/1tfz5AtU3pddb46PG93HFlzpE8zqy421N0MKxHBCSqpo/edit?usp=sharing

当我找到这个页面时遇到了同样的问题(将马尼拉时间转换为悉尼时间并自动调整夏令时)。

我不想有自定义功能,但我发现,在悉尼,AEST(澳大利亚东部标准时间)从四月的第一个星期日开始,AEDT(澳大利亚东部夏令时间)从第一个星期日开始十月。

所以我想,如果我能找到一个公式来检测日期是否介于 4 月的第一个星期日和 10 月的第一个星期日(标准时间)之间,那么我可以自动将 1 小时添加到通常的 2 小时到马尼拉夏令时期间的时间(落在这两个日期之外的日期)为悉尼时间。

这两个 Excel 解决方案在 Google 表格中运行良好:

今年四月的第一个星期天(A1):

=CONCATENATE("4/1/",Year(today()))+CHOOSE(WEEKDAY(CONCATENATE("4/1/",Year(today())),1),7,6,5,4,3,2,1)

今年10月的第一个星期日(A2):

=CONCATENATE("10/1/",year(today()))+CHOOSE(WEEKDAY(CONCATENATE("10/1/",year(today())),1),7,6,5,4,3,2,1)

夏令时检测器 (A3) — 如果日期在这两个日期之外,则为悉尼夏令时:

=IF(AND(today()>A1,today()<A2),"AEST","AEDT")

悉尼时间(A4):

=NOW()+TIME(IF(A3="AEDT",3,2),0,0)

NOW()可以改成任意时间制表格式:

只需使用 TZData 格式从 UTC“提取”同步并显示您的选择。

为了将您的手机显示“更改”为柏林当地时间的示例

=fromUTC(N82, "Europe/Berlin")

或东京

=fromUTC(N82, "Asia/Tokyo")

或旧金山

=fromUTC(N82, "America/Inuvik")

时区参考点在这里 >>

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

我是新贡献者和新手,但我偶然发现了一个功能,尽管在 Sheets/Time 区域问题上搜索了很多小时,但仍未被提及。希望这个相对简单的解决方案能有所帮助。

对于我的 sheet,我只想添加一行并在前两个单元格中自动填充本地 sheet 日期和时间。

.getTimezoneOffset() returns 客户端 TZ 和 GMT 之间的分钟差异,在纽约夏令时期间为 240。函数 returns 正数用于区域“GMT-x”,对于带有“GMT+x”的区域,反之亦然。因此需要除以 -60 以获得正确的小时和符号。

function addRow() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  sheet.insertRows(2, 1);
  rightNow = new Date();
  var tzOffset = "GMT" + rightNow.getTimezoneOffset() / -60;
  var fDate = Utilities.formatDate(rightNow, tzOffset, "MM-dd-yyyy");
  var fTime = Utilities.formatDate(rightNow, tzOffset, "HH:mm");
  sheet.getRange('A2').setValue(fDate);
  sheet.getRange('B2').setValue(fTime);
  sheet.getRange('C2').setValue(tzOffset);
}

从那以后我发现我不是第一个对提及 .getTimezoneOffset() 的 GMT 校正难题做出回应的人。然而,这个帖子对这个话题的看法最多,所以我觉得这个选项值得一提。

DST 将于 2021 年 11 月 7 日在这里结束,所以如果它没有按预期调整为“GMT-5”,我会报告回来

.getTimezoneOffset()

最简单的方法是使用简单的计算。

在工作表中使用=NOW()命令并减去时差除以24。

示例: IST 飞往哥伦比亚

=NOW()-(10.5/24)

印度和哥伦比亚的时差是10小时50分钟,我们需要用“现在”时间减去它除以24。

如果时区早于你所在的地方,那么你需要添加它。 示例:

IST 飞往日本:

=NOW()+(3.5/24)

=现在默认为美国时间,您可以在设置中的通用下更改。

enter image description here

enter image description here