2011-11-24 75 views
22

iam與一個實時項目,其中我有一個要求,找到自1970年1月以來的秒數1.我已經使用下面的代碼找出秒,但給出了錯誤的結果。代碼是如下。如何找到自1970年以來在java中的秒數

public long returnSeconds(int year, int month, int date) { 
    Calendar calendar1 = Calendar.getInstance(); 
    Calendar calendar2 = Calendar.getInstance(); 
    calendar1.set(1970, 01, 01); 
    calendar2.set(year, month, date); 
    long milliseconds1 = calendar1.getTimeInMillis(); 
    long milliseconds2 = calendar2.getTimeInMillis(); 
    long diff = milliseconds2 - milliseconds1; 
    long seconds = diff/1000; 
    return seconds; 
} 

在上述地方的year,month,date我傳遞2011,10,1和IAM越來越

1317510000 

但正確答案是

1317427200 

任何有關這是非常有用的,我幫。

+3

'getTimeInMillis()'*已經*從Unix紀元措施(1970年等等等等)。如果你看毫秒1,它應該是零(除非你遇到時區問題)。所以採取差異是不必要的 –

回答

34

根據你的願望1317427200是輸出,有幾層問題需要解決。

  • 首先像其他人提到的那樣,java已經使用UTC 1/1/1970時代。除非你有怪異的區域設置規則,否則通常不需要計算時期和執行減法。

  • 其次,當您創建新日曆時,它會被初始化爲'now',因此它包含一天中的時間。更改年/月/日不會影響一天中的時間字段。因此,如果您希望它代表日期的午夜,則需要在設置日期之前將日曆清零。

  • 第三,你還沒有指定你應該如何處理時區。夏時制可能會導致特定日曆日曆所代表的絕對秒數的差異,具體取決於您的JVM運行的位置。由於時代是UTC,我們可能希望在UTC時間工作?您可能需要向您與系統連接的系統製造商尋求澄清。

  • 第四,Java中的月份是零索引。一月是0,十月是9。

把所有的一起

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
calendar.clear(); 
calendar.set(2011, Calendar.OCTOBER, 1); 
long secondsSinceEpoch = calendar.getTimeInMillis()/1000L; 

,會給你1317427200

+1

我的日期和時間是「19 9月2062 02:30:00」,我想得到「-2147483648」但我沒有得到。我目前的結果是「2925858600」。 – 2013-04-19 05:45:32

+1

@Varun Patel對於一個負數的人,預計日期將在1962年,而不是2062年..... – Affe

53

方法Calendar.getTimeInMillis()Date.getTime()都從1970年1月1日起返回毫秒。

對於當前的時間,你可以使用:

long seconds = System.currentTimeMillis()/1000l; 
+0

我認爲OP想知道從時代到特定時間的毫秒數,不一定是「現在」。 –

+1

有沒有Calendar.getTimeInMillis()?我認爲它是'Calendar.getInstance()。getTimeInMillis()'。 – eivamu

+0

你爲什麼分到10001? – bubakazouba

7

這是Date.getTime()

+0

其實'Date.getTime()'返回** milli **秒的量,而不是秒。要秒調用'Date.getTime()/ 1000'。 –

3

如果您的參考月份是1月和10月,您需要的答案是「1317427200」。如果是這樣,你正在尋找的日期是1970年1月和2011年10月01日,對嗎?

然後問題是你用了幾個月的這些數字。如果您查看日曆API文檔甚至那裏提供的常量(「Calendar.JANUARY」,「Calendar.FEBRUARY」等),您會發現月份從0開始(1月份) 。

因此,檢查你的代碼,你傳遞二月和十一月,這將導致「1317510000」。

此致敬禮。

+0

哦..我把1月當作1,這就是爲什麼我錯了答案,任何方式我得到了答案。你是正確的。謝謝你的答案。 – androiduser

4

您所看到的差異很可能是因爲你不爲零小時,分鐘,秒和毫秒Calendar實例的字段:Calendar.getInstance()爲您提供當前的日期和時間,就像new Date()System.currentTimeMillis()

注意,month field of Calendar從零開始,即一月份爲0,而不是1

另外,不要前綴號碼與零,這可能看起來不錯,它甚至工作,直到你達到8: 08不是Java中的有效數字。將數字前綴爲零會使編譯器假定您將它們定義爲八進制數字,只能使用07(對於單個數字)。

剛落calendar1完全(1970-01-01 00:00:00'000是開始時期,即零反正),並做到這一點:

public long returnSeconds(int year, int month, int date) { 
    final Calendar cal = Calendar.getInstance(); 
    cal.set(year, month, date, 0, 0, 0); 
    cal.set(Calendar.MILLISECOND, 0); 
    return cal.getTimeInMillis()/1000; 
} 
+0

這看起來是唯一的完整答案的問題..想知道爲什麼沒有人注意到它。正確的實施,相同的方法簽名按要求。 – PaoloC

1

java.time

使用內置於Java 8及更高版本中的java.time框架。

import java.time.LocalDate; 
import java.time.ZoneId; 

int year = 2011; 
int month = 10; 
int day = 1; 
int date = LocalDate.of(year, month, day); 

date.atStartOfDay(ZoneId.of("UTC")).toEpochSecond; # Long = 1317427200 
8

由於Java8:

java.time.Instant.now().getEpochSecond() 
相關問題