我知道这很简单。
在Google电子表格中,我有一个列,我在一个时区(GMT)中输入时间 另一列应自动在另一个时区(太平洋时间)获取时间
GMT | PT
----------|------------
5:00 AM | 9:00 PM
截至目前我正在使用
=$C$3-time(8,0,0)
问题在于,我想更改夏令时的时间公式。
是否有任何可用的功能或脚本可以将夏令时自动保存到计算中。
答案 0 :(得分:14)
没有内置功能,但您可以构建自定义功能。
/**
* 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来设置默认日期和时区。
=myFunction("October 29, 2016 "&A2&" GMT","PDT","hh:mm a")
除了使用三个字母的时区代码外,我们还可以TZ database names使用America/Los_Angeles
,例如:
=myFunction("October 29, 2016 "&A2&" GMT","America/Los_Angeles","HH:mm")
答案 1 :(得分:2)
Google表格没有内置的时区数据转换方式,但是通过使用Moment.js和Google的脚本编辑器的强大功能,我们可以将时区功能添加到任何表格中。
这些是我复制到脚本项目中的文件:
请确保首先添加moment.js脚本,并将其置于moment-timezone.js脚本之上,因为moment-timezone.js依赖于此。
然后在您的 other 脚本项目中,您的Code.gs文件如下所示:
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);
}
答案 2 :(得分:1)
那也可以不用宏来完成。仅使用功能和数据操作就足够了。在这里说明整个过程会比较麻烦。您只需研究各种时间功能的工作原理并利用您的创造力即可。
提示:如果需要当前日期和时间,请使用=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中的人们来说,他们在三月从PST到PDT,在十一月从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偏移量。
答案 3 :(得分:0)
在Google表格中创建自己的时区转换器:
步骤1: Create your table for the timezone converter.
第2步: Enter the times for your time zones in a column. 注意:请确保您选择日期/时间格式(选择单元格->格式->数字->时间/日期)
步骤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工作表以供参考: https://docs.google.com/spreadsheets/d/1tfz5AtU3pddb46PG93HFlzpE8zqy421N0MKxHBCSqpo/edit?usp=sharing
答案 4 :(得分:0)
发现此页面时,我遇到了同样的问题(将马尼拉时间换算为悉尼时间,并自动调整夏令时)。
我不想使用自定义功能,但我发现在悉尼,AEST(澳大利亚东部标准时间)在4月的第一个星期日开始,而AEDT(澳大利亚东部夏令时)在10月的第一个星期日开始
所以我想,如果我可以找到一个公式来检测日期是否介于4月的第一个星期日和10月的第一个星期日之间(标准时间),那么我可以自动将1小时加到通常的2小时马尼拉时间夏令时(两个日期以外的日期)具有悉尼时间。
这两个Excel解决方案在Google表格中效果很好:
今年4月的第一个星期日(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)
DST检测器(A3)-如果某个日期落在这两个日期之外,则为悉尼的DST:
=IF(AND(today()>A1,today()<A2),"AEST","AEDT")
悉尼时间(A4)
=NOW()+TIME(IF(A3="AEDT",3,2),0,0)
NOW()
可以更改为任何时间格式以进行制表: