Google电子表格中的时区转换

Timezone conversion in a Google spreadsheet

我知道这看起来很简单。

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

1
2
3
 GMT      | PT
----------|------------
 5:00 AM  | 9:00 PM

截至目前,我正在使用

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

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

是否有可用的功能或脚本可以自动将夏令时纳入计算。


简短答案

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

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * 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 {"GMT"} timeZone Target timezone
 *@param {"YYYY-MM-dd hh:mm a z"} Datetime format
 *@customfunction
 */
function myFunction(datetimeString,timeZone,format) {
  var moment = new Date(datetimeString);
  return Utilities.formatDate(moment, timeZone, format)
}

说明

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

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

更新

除了使用三个字母时区代码外,我们还可以使用TZ数据库名称,例如America/Los_Angeles,例如:

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

也可以看看

  • 在Google Apps脚本中计算日期之间的年,月,日

参考

  • https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date


本教程非常有用: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.

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

  • https://momentjs.com/downloads/moment-with-locales.js另存为moment.js
  • https://momentjs.com/downloads/moment-timezone-with-data.js另存为moment-timezone.js

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

然后在另一个脚本项目中,您的Code.gs文件如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var DT_FORMAT = 'YYYY-MM-DD HH:mm:ss';

/**
https://stackoverflow.com/questions/34946815/timezone-conversion-in-a-google-spreadsheet/40324587
*/
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);
}

/**
https://stackoverflow.com/questions/34946815/timezone-conversion-in-a-google-spreadsheet/40324587
*/
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);
}

enter image description here


不用宏也可以做到这一点。仅使用功能和数据操作就足够了。在这里说明整个过程会比较麻烦。您只需研究各种时间功能的工作原理并利用您的创造力即可。

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

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

还可以在线搜索各个标准时区(PT,MT,CT,ET,AT)相对于协调世界时(UTC)的夏令时偏移量。例如,在2019年太平洋时间的偏移量是UTC-7,此时观察到的夏令时开始于3月10日凌晨2点(太平洋),直到11月3日凌晨2点。这意味着从UTC到太平洋的时间差是7小时。一年中的其余时间为8小时(UTC-8)。在3月某个时候(本年的10月)开始进行DST观测期间,它通过将时钟向前移动1个小时(也就是我们所说的UTC-7)(夏令时)而从PST到PDT。遵守DST后,通过将时钟再次移回1小时或我们称为UTC-8(或冬季时间),它从PDT变为PST。请记住,三月份的时钟提前了一个小时,以更好地利用时间。这就是我们所说的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 dot com网站是所有人了解时区以及如何处理夏时制的良好信息来源。他们那里也有所有UTC偏移量。