2015-09-22 45 views
4

我一直在使用Processing 3.0,並且我試圖打印一個簡單的時間戳,當我的Arduino輸出某些值時,但它不起作用。我試圖使用SimpleDateFormat,但它總是返回1970.01.17 17:48:35 GMT,而不是實際的時間。下面是MVCE:SimpleDateFormat總是返回錯誤的時區1970.01.17

void setup() 
{  
    SimpleDateFormat format = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss z"); 
    format.setTimeZone (TimeZone.getDefault()); 

    long timestamp = getTimeNow(); 
    println(format.format(new Date(timestamp))); 
    println(timestamp); 
} 

long getTimeNow() 
{ 
    Date d = new Date(); 
    Calendar cal = new GregorianCalendar(); 

    long current = d.getTime()/1000; 
    long timezone = cal.get(Calendar.ZONE_OFFSET)/1000; 
    long daylight = cal.get(Calendar.DST_OFFSET)/1000; 
    return current + timezone + daylight; 
} 

輸出例如:

1970.01.17 17:48:35 GMT 
1442915733 

我懷疑問題是與getTimeNow(),因爲,如果我插值到在線時代轉換器我得到正確的時間。上述代碼中的問題是什麼?

+0

你能指點我們的格式(長)'文檔嗎? AFAIK這不存在 –

+0

確實,它不存在。應該更徹底地檢查參考。不過,如果我嘗試使用Date構造函數將其轉換爲日期,它仍然會給我一個錯誤的問題。編輯帖子以反映變化。 – MKII

回答

15

Date object參數接受的時間只有毫秒而不是秒。你需要乘以1000.並確保你提供它很長時間。

Date dateObj = new Date(1442915733 * 1000); 
System.out.println(dateObj); 
+0

好吧,它幾乎可以工作,具有正確的時區和所有...但它具有錯誤的DST偏移量,所以它顯示提前一個小時的時間。 – MKII

+0

'/ 1000'還在嗎?他們應該簡單地被刪除。否則長整數除法截斷。雖然這應該沒問題。 –

+0

把1000L而不是1000.更多的信息在這裏:http://stackoverflow.com/a/5041249/2612536 –

0

決定後這是一個答案,因爲它是從Mitesh的解決方案不同。

我放棄了getTimeNow()功能,而是我只是創造了一個新的日期和使用的:

void setup() 
{  
    SimpleDateFormat format = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss z"); 
    format.setTimeZone (TimeZone.getDefault()); 

    Date timestamp = new Date(); 
    println(format.format(timestamp)); 
} 

的原因是雙重的。在應用Matesh的答案之後,我在代碼中遇到了另一個問題,即TimeZone會忽略DST設置,因此時間戳中的小時數是錯誤的。此外,該解決方案消除了對多行代碼的需求,這總是有幫助的。