如何使用负时间戳来进行数学运算?

时间:2015-07-21 19:36:27

标签: javascript datetime google-apps-script

我正在使用Google Spreadsheets,我有一张表格如下:

Start | End     | Partial result | Expected | Total
08:00 | 12:00   | 04:00          | 05:00    | -01:00
14:00 | 18:00   | 04:00          | 05:00    | -01:00
----------------------------------------------------
                                 | Month tot| -02:00

如您所见,它允许负面持续时间标记。这在Google Scripts中给我带来了很多麻烦。

我想通过电子邮件向每个人发送月度摘要。

这是一个简单的片段:

var sheet = SpreadsheetApp.getActive().getSheetByName(...);
var monthlyTotal = sheet.getRange(1, 1).getValue(); //The total is at cell A1

现在,当我调试时,它将我的monthlyTotal显示为Date对象,设置为Tue Dec 26 1899 14:50:28 GMT-0300 (BRT)(这是非常正确的,我的结果是-81:16:00,它减去81:16来自1970-01-01 00:00:00,没有问题。)

现在,我不知道如何回到持续时间格式(-81:16)。我尝试将此日期对象转换为负时间戳,但+monthlyTotal会返回我认为错误的值(-2212132172000)。

我不知道如何将Date对象从之前的转换为时间戳,因此我不知道如何继续。

2 个答案:

答案 0 :(得分:1)

此问题已在webapps.stackexchange.com上得到解答。

简短回答

请勿在日期/时间单元格上使用.getValue()。相反,将=TO_TEXT(A1)放在某处(或者已经包含类似TO_TEXT(SUM(E2:E))的A1,并使用.getValue()来获取字符串。数字和字符串在工作表和脚本之间传递可靠,不像日期和时间。

解释

与1970-01-01开始时代的Unix操作系统不同,Google表格使用December 30, 1899 0:00:00作为0时间,您可以在电子表格的任何位置输入=TO_DATE(0)来查看。

原则上,您可以将.valueOf()应用于.getValue()返回的持续时间值:这将返回JavaScript时间戳,即从开头的毫秒秒的数量1970.除以1000给出了Unix时间戳。

然而,这是有问题的,因为Unix时间戳和因此JavaScript时间戳是从UTC 的1970-01-01 00:00:00 时刻开始测量的,而Google表格的0标记位于本地时区即可。

如果您尝试使用new Date().getTimezoneOffset();调整时区,请注意脚本时区可能与工作表时区不同:documentation says这是“脚本错误的常见来源”。方法Spreadsheet.getSpreadsheetTimeZone()给出了电子表格本身的时区,但它以“美国/纽约”字符串的形式返回,does not directly translate to an offset

答案 1 :(得分:0)

您的ThisWorkBook+monthlyTotal1970-01-01 00:00:00之间的毫秒数。

时间戳是什么意思?根据您的Tue Dec 26 1899 14:50:28 GMT-0300 (BRT)对象,您可以Date根据UTC时间获得所需内容。