java joda 获取utc时间_java – 使用JodaTime以毫秒为单位的UTC到本地时间
我試圖使用Jodatime顯示特定時間段內的交易.
我們的服務器要求開始日期和結束日期為UTC(這可能是顯而易見的).因此,圍繞它們的任何業務邏輯都使用DateTime對象,時區設置為DateTimeZone.UTC,例如,
mStartDate = DateTime.now(UTC).withTimeAtStartOfDay();
除了顯示我不知道如何為本地(系統默認)時區增加它的時間之外,這很有效.理想情況下,我想使用傳遞兩個本地時間戳的DateUtils formatDateRange函數.但getMillis()函數似乎不考慮本地偏移:
我也試過這個:
mTimePeriodTitle.setText(DateUtils.formatDateRange(mContext, f, mStartDate.getMillis(),
mEndDate.getMillis(), DateUtils.FORMAT_SHOW_TIME,
TimeZone.getDefault().getID()).toString());
但它沒有任何區別.所以我的問題是如何獲得具有2個UTC時間戳的格式良好的本地日期范圍?
解決方法:
如果您的DateTime是UTC并且您想將其轉換為另一個時區,則可以使用withZone方法進行轉換.
對于下面的示例,我的默認時區是America / Sao_Paulo(您可以使用DateTimeZone.getDefault()檢查您的時區):
// create today's date in UTC
DateTime mStartDate = DateTime.now(DateTimeZone.UTC).withTimeAtStartOfDay();
// date/time in UTC
System.out.println(mStartDate); // 2017-06-13T00:00:00.000Z
// date/time in my default timezone (America/Sao_Paulo)
System.out.println(mStartDate.withZone(DateTimeZone.getDefault())); // 2017-06-12T21:00:00.000-03:00
輸出是:
2017-06-13T00:00:00.000Z
2017-06-12T21:00:00.000-03:00
請注意,withZone方法正確地將日期和時間轉換為我的時區(在America / Sao_Paulo中,當前偏移量為UTC-03:00),因此進行了相應調整.
如果您想獲得時間(小時/分鐘/秒),可以使用toLocalTime()方法:
System.out.println(mStartDate.withZone(DateTimeZone.getDefault()).toLocalTime()); // 21:00:00.000
輸出是:
21:00:00.000
如果您想要其他格式(例如,不打印秒數的3位數),則可以使用DateTimeFormatter.好處是您可以在格式化程序中設置時區,因此您無需轉換DateTime:
// create formatter for hour/minute/second, set it with my default timezone
DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm:ss").withZone(DateTimeZone.getDefault());
System.out.println(fmt.print(mStartDate)); // 21:00:00
輸出是:
21:00:00
要獲得范圍,可以使用上述方法之一和DateTime(mStartDate和mEndDate),并使用DateTimeFormatter更改為您需要的任何格式.
PS:我認為你在使用getMillis()時缺少的是日期時間(UTC和默認時區)代表同一時刻.你只是將這一瞬間轉換為當地時間,但毫秒是相同的(想想,此時此刻,世界上的每個人都處于同一時刻(相同的毫秒),但他們的當地時間可能會有所不同取決于他們在哪里).因此,在將UTC DateTime轉換為另一個時區時,我們只是找到該區域中的當地時間,該時間對應于相同的millis.
您可以在兩個對象上使用getMillis()方法檢查:
System.out.println(mStartDate.getMillis()); // 1497312000000
System.out.println(mStartDate.withZone(DateTimeZone.getDefault()).getMillis()); // 1497312000000
請注意,即使我將對象轉換為另一個時區,millis仍保持不變(1497312000000).那是因為兩者都代表同一時刻,我只是將它們移動到另一個時區,其中各自的當地時間不同.
Java新的日期/時間API
Joda-Time它被停用并被新的API取代,所以我不建議用它開始一個新項目.如果是這種情況,您可以考慮使用新的日期/時間API,但如果您使用Joda的代碼庫很大或者現在不想遷移它,您可以考慮其余的答案.
無論如何,即使在joda’s website它說:“請注意,Joda-Time被認為是一個很大程度上已完成的項目.沒有計劃進行重大改進.如果使用Java SE 8,請遷移到java.time(JSR-310).” *.
如果您使用Java< = 7,則可以使用ThreeTen Backport,這是Java 8的新日期/時間類的一個很好的后端.對于Android,有一種方法可以使用它,使用ThreeTenABP(更多關于如何使用它here).
以下代碼適用于兩者.
唯一的區別是包名稱(在Java 8中是java.time,在ThreeTen Backport(或Android的ThreeTenABP)中是org.threeten.bp),但類和方法名稱是相同的.
要以UTC開頭獲取當前日期,您可以執行以下操作:
// UTC's today at start of the day
ZonedDateTime utc = LocalDate.now(ZoneOffset.UTC).atStartOfDay(ZoneOffset.UTC);
System.out.println(utc); // 2017-06-13T00:00Z
首先,我使用LocalDate.now(ZoneOffset.UTC)來查找UTC中的當前本地日期.如果我只使用LocalDate.now(),它將在我的默認時區得到當前日期,這不是我們想要的(它可能與UTC不同,具體取決于你在哪里 – 何時 – 你是什么以及默認時區是什么是).
然后我使用atStartOfDay(ZoneOffset.UTC)來獲取UTC當天的開始.我知道使用UTC兩次聽起來多余,但是API允許我們在這種方法中使用任何時區,而IMO它明確了我們想要的時區(如果日期是在夏令時變化的時區,那么一天的開始可能不是午夜 – 時區參數是為了保證設置正確的值).
輸出是:
2017-06-13T00:00Z
要轉換為我的默認時區,我可以使用ZoneId.systemDefault(),在我的例子中返回America / Sao_Paulo.要轉換它并只獲取本地時間部分,只需執行以下操作:
System.out.println(utc.withZoneSameInstant(ZoneId.systemDefault()).toLocalTime()); // 21:00
輸出是:
21:00
如果要更改它,還可以使用格式化程序:
// formatter for localtime (hour/minute/second)
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(fmt.format(utc.withZoneSameInstant(ZoneId.systemDefault()))); // 21:00:00
輸出是:
21:00:00
標簽:android,java,datetime,jodatime,datetime-conversion
來源: https://codeday.me/bug/20190727/1551856.html
總結
以上是生活随笔為你收集整理的java joda 获取utc时间_java – 使用JodaTime以毫秒为单位的UTC到本地时间的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java核心类库篇6——IO
- 下一篇: Java面试——MyBatis系列总结