簡體   English   中英

在java中將iso8601日期轉換為unix時間戳

[英]Converting iso8601 date to unix timestamp in java

我有一個日期字符串

   String s = "2014-09-01T19:22:43.000Z";
  Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").parse(s);

但我得到一個例外:

Exception in thread "main" java.text.ParseException: Unparseable date: "2014-09-01T19:22:43.000Z"

如何將上面的字符串轉換為unix時間戳? 謝謝

TL;博士

如何將上面的字符串轉換為unix時間戳?

Instant.parse( "2014-09-01T19:22:43.000Z" )
       .getEpochSecond()

java.time

java.time.Instant類可以使用標准ISO 8601格式解析輸入字符串。 無需指定格式模式。

Instant instant = Instant.parse( "2014-09-01T19:22:43.000Z" );

要獲得自1970年代以來的毫秒數:

long millisecondsSinceUnixEpoch = instant.toEpochMilli() ;

自1970-01-01T00:00:00Z時代以來的整整秒

long secondsSinceUnixEpoch = instant.getEpochSecond() ;

在達到毫秒或整秒時,請注意可能的數據丟失 java.time類具有納秒分辨率,因此值中存在的任何微秒或納秒都將被截斷。

喬達時間

更新 Joda-Time項目現在處於維護模式。 該團隊建議遷移到java.time類。

Joda-Time庫使這項工作更容易。 您的ISO 8601兼容字符串可以直接提供給Joda-Time構造函數。 內置解析器需要ISO 8601。

DateTime dateTime = new DateTime( "2014-09-01T19:22:43.000Z" ) ;

Unix時間戳

你是什​​么意思的Unix時間戳? 有些人的意思是自1970年UTC的第一個時刻(Unix 紀元 )以來的整秒數,而忽略了閏秒(參見Unix時間 )。 有些人的意思是毫秒或其他分辨率。

注意使用long原語而不是更常見的int

對於毫秒,請調用getMillis()

long millisecondsSinceUnixEpoch = dateTime.getMillis();

整整一秒,除以1,000。 考慮是否要舍入或截斷小數秒。


通常我會建議將DateTimeZone對象和您的字符串一起傳遞給DateTime構造函數。 但是沒有必要,如果你想要的只是一個自紀元以來的計數。


關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊遺留日期時間類,如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

從哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目是未來可能添加到java.time的試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

X用於SimpleDateFormat ISO 8601 time zone ,而不是Z

正確的格式是"yyyy-MM-dd'T'HH:mm:ss.SSSX"

暫無
暫無

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

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