簡體   English   中英

在Java中使用不同的日期作為UNIX時代?

[英]Use different date as UNIX epoch time in Java?

我知道標准的UNIX紀元時間是1/1/70,我可以使用此變量將當前時間轉換為UNIX時間:

int時間=(int)((System.currentTimeMillis())/ 1000);

(注意:我知道它通常存儲為64位長,但我需要將其存儲為32位,因此將其強制轉換為int)。

我的問題是-Java中是否有任何內置方法,您可以在其中傳遞不同的日期作為“時期”。 我要獲取的是自特定日期以來#秒的時間戳。 即我想將2015年1月1日定義為我的時代。 那么每個未來的日期將是自2015年1月1日以來的秒數。

如果沒有Java庫提供該功能,那么有關如何執行此操作的任何想法? 謝謝,蒂姆

不需要庫,您只需要使用數學即可。

static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
static final long EPOCH = new Date(2015 - 1900, Calendar.JANUARY, 1).getTime(); // 2015/1/1 in GMT

public static int secondSinceEpoch() {
    return (int) ((System.currentTimeMillis() - EPOCH) / 1000);
}

public static String epochToString(int secsSince2015) {
    return SDF.format(new Date(secsSince2015 * 1000 + EPOCH));
}

public static void main(String... ignored) {
    System.out.println(new Date(EPOCH));
    System.out.println("Epoch is " + epochToString(0));
    System.out.println("Today is " + secondSinceEpoch() + " secs");
    System.out.println("Today is " + secondSinceEpoch() / 86400 + " days");
}

版畫

Thu Jan 01 00:00:00 GMT 2015
Epoch is 2015/01/01 00:00:00
Today is -15732850 secs
Today is -182 days

您可能必須滾動自己的時間和日期方法,這將基本上重新包裝標准方法,同時將相應的秒數減去正確的秒數,以得出新的紀元。

所以,也許像

public class MyEpoch {
    public static final Long MY_EPOCH = //number of seconds betweer 1/1/70 and 1/1/2015
    private Date unixEpochDate;
    //etc
    public Long getMyEpoch() {
        return unixEpochDate.getTime() - MY_EPOCH;
    }
}

TL;博士

long totalSeconds = Duration.between ( OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC ) , OffsetDateTime.now ( ZoneOffset.UTC ) ).getSeconds ();

經過時間

忘記時代參考日期 您想要的只是經過的時間。

java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date.Calendarjava.text.SimpleDateFormat Joda-Time小組還建議遷移到java.time。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。

多的java.time功能后移植到Java 6和7在ThreeTen-反向移植並且還適於在到Android ThreeTenABP

時區

您的問題未能解決時區這一關鍵問題。

既然您提到了Unix風格的時間,我將假設您打算使用UTC時區。 Instant類以UTC表示時間軸上的時刻,分辨率最高為納秒。 為了獲得更大的靈活性,包括設置格式,請使用OffsetDateTime和指定的UTC偏移量。

Duration

OffsetDateTime類表示具有指定的UTC偏移量的日期和時間。 我們可以將常量ZoneOffset.UTC指定為偏移值。

Duration類將Duration跨度表示為總秒數,以秒為單位,以納秒為單位。 我們可以從我們的OffsetDateTime對象對中獲取一個Duration對象。

調用Duration::getSeconds獲取Duration::getSeconds的總秒數。 但是請注意,我們可能會丟失數據,因為自然會從結果數中忽略任何小數秒。

OffsetDateTime start = OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC );
OffsetDateTime now = OffsetDateTime.now ( ZoneOffset.UTC );

Duration duration = Duration.between ( start , now );
long totalSeconds = duration.getSeconds ();

轉儲到控制台。

System.out.println ( "start: " + start + " | now: " + now + " | duration: " + duration + " | totalSeconds: " + totalSeconds );

開始時間:2015-01-01T00:00Z | 現在:2016-07-24T04:15:57.345Z | 持續時間:PT13684H15M57.345S | 總計秒:49263357

換個方向,從您的起點算起幾秒鍾的日期時間很容易。 只需致電plusSeconds

使用TimeUnit類,而不是使用“魔術”數字和數學計算來TimeUnit代碼,以獲取秒數。

OffsetDateTime start = OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC );
long seconds = TimeUnit.HOURS.toSeconds ( 7 );  // Let `TimeUnit` class do the math of calculating seconds.
OffsetDateTime stop = start.plusSeconds ( seconds );

2015-01-01T07:00Z

暫無
暫無

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

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