簡體   English   中英

如何將日期對象和時間對象組合成DateTime對象並作為DateTime對象存儲在Google工作表中

[英]How to combine date object and time object into DateTime object and store in google sheet as DateTime object

我有一個日期對象和一個時間對象,它們想要組合成一個日期時間對象,而不是字符串,而是一個日期時間對象,可以存儲起來以便以后與其他日期時間對象進行測試。 像這樣的所有問題似乎都涉及日期時間的字符串格式。

我嘗試將兩個對象簡單地加在一起,這兩個對象適用於圖紙的兩個元素,但不適用於腳本變量。

var lastDayPumpOn = new Date();
lastDayPumpOn = lastPumpDate + lastPumpTime;
Browser.msgBox('Last on time = '+lastDayPumpOn);

這個簡單的加法產生的東西似乎是零時間日期和零日期時間的串聯。 我不清楚它是否實際上是日期時間對象或某個字符串。

JavaScript中沒有“ time”或“ datetime”對象,只有Date

為什么要輸入字符串而不是新日期

如果要將存儲在Date對象中的毫秒數加在一起,則必須注意,這兩個參數的確是Date對象或數字(代表毫秒數),並使用.getTime()或以變量+ .getTime()的毫秒數。

// this assumes lastPumpTime is some Date that has had its date component "zeroed out"
var lastDayPumpOn = new Date(lastPumpDate.getTime() + lastPumpTime.getTime()); // construct new Date from milliseconds argument
// or
var lastDayPumpOnAlt = new Date(+lastPumpDate + +lastPumpTime); // implicitly using Date.prototype.valueOf
// lastDayPumpOn.getTime() === lastDayPumpOnAlt.getTime() is true
Browser.msgBox('Last on time = ' + lastDayPumpOn); // implicitly calls lastDayPumpOn.toString()

如果圍繞+任一變量是字符串,則結果將是字符串。 任何對象都會隱式調用其.toString函數。

歸零日期部分

要創建“時間”對象(不帶日期部分的“日期”),有多種方法,其中一種是將日期部分設置為1970年1月1日。

lastPumpTime.setFullYear(1970);
lastPumpTime.setMonth(0); // Jan === 0, zero indexed
lastPumpTime.setDate(1);

現在, lastPumpTime.getTime()比24小時的毫秒數少了幾毫秒。

我終於使它工作了,所以我認為我應該列出工作代碼,以防其他人發現它有用。 也許我的要求很不尋常,因為我找不到類似的例子。 將日期和時間與字符串格式的日期和時間相結合的所有其他示例。
通過此練習,我學到了很多有關日期操作的知識。 dwmorrin是一個很大的幫助。 最后一個驚喜是需要更正時區。 我發現固定時間將結果留在GMT區域,實際上GMT被夏令時偏移了。 我使用getTimezoneOffset可能不是解決此問題的最通用方法,但它適用於我的時區。 再次感謝您dwmorrin。

    // The variables lastPumpDate and lastPumpTime are a date and time read from two columns of 
    // dates and times that had been at some earlier time deconstructed from a column of full 
    // date-time objects using the spreadsheet functions int(date) and mod(date,1).  
    // This code segment of a script is to reconstruct the full date-time object to be stored in another 
    // sheet for further processing.  
    Var lastPumpTimeFixed = lastPumpTime;  // Time object must have date component cleared
    lastPumpTimeFixed.setFullYear(1970);       // This done by setting it to base date
    lastPumpTimeFixed.setMonth(0);
    lastPumpTimeFixed.setDate(1);
    var valTimezoneOffset = lastPumpTime.getTimezoneOffset()*60*1000;
    var lastDayPumpOn = new Date(+lastPumpDate.getTime() +lastPumpTimeFixed.getTime() - valTimezoneOffset);

此解決方案的進一步說明:.getValues()函數從現有的Google工作表中讀取了僅日期對象lastPumpDate,該函數還添加了工作表單元格中不存在的時區偏移量。 如果/將腳本變量與時間對象組合在一起,則將腳本變量的時間設置為等效的UTC。 時區偏移量基於運行腳本的時區,並且包括基於讀取日期的夏令時調整。 同樣,使用.getValues()函數從先前存在的工作表中讀取了僅時間對象lastPumpTime,該函數還添加了工作表單元格中可能不存在的時區偏移量,我不確定是否要挖掘那么遠。 對於運行腳本的時區,此時區偏移也正確,可以將時間設置為等效的UTC,但由於其日期未知,因此無需對夏令時進行任何調整。 因此,在“新日期”操作中將僅日期對象添加到僅時間對象時,結果具有兩個時區偏移,其中一個已調整為夏令時,另一個未調整。 這就是必須減去一個偏移量的原因,它必須是與僅包含時間的對象相關聯的偏移量,其中不包括夏令時調整。 然后,當腳本的后面部分將所得的完整日期時間對象放入新工作表中時,剩余偏移量實際上未被應用,從而使完整日期時間單元格的時間與原始僅時間單元格的時間相同。 我不能肯定地說如果最終工作表與原始工作表處於不同時區會發生什么,但是我想可以應用不同的調整,使整個日期時間單元格的時間與原始工作表具有相同的UTC,但已調整在不同的時區。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM