[英]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;
}
}
long totalSeconds = Duration.between ( OffsetDateTime.of ( 2015 , 1 , 1 , 0 , 0 , 0 , 0 , ZoneOffset.UTC ) , OffsetDateTime.now ( ZoneOffset.UTC ) ).getSeconds ();
忘記時代參考日期 。 您想要的只是經過的時間。
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊日期時間類,例如java.util.Date
, .Calendar
和java.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.