[英]Java Date Format Issue
我有從1969年12月31日19:00:00開始的秒數,即(EST),我想將其轉換為日期格式。
我有以下代碼,它返回任何無效的日期。 任何人都可以指出這里的問題所在。
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class sample
{
public static void main(String args[])
{
DateFormat df = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("EST"));
Date d1 = new Date(1000*1373604190); //Converting to millisecond
String formattedDate = df.format(d1);
System.out.println(formattedDate); //I'm getting 22/Dec/1969 16:50:55
}
}
我該如何解決。
您正在使用int
文字而不是long
在你的號碼。 默認情況下,整數文字為int
除非您指定結尾為L的long
。 嘗試這個:
Date d1 = new Date(1000*1373604190L);
(請注意,您的文字1373604190的末尾是L)
Instant.ofEpochSeconds( 1_373_604_190L )
.atZone( ZoneId.of( "America/New_York" ) )
.format( DateTimeFormatter.ofPattern( "dd MMM uuuu HH:mm:ss" , Locale.CANADA ) )
從1969年12月31日19:00:00開始的秒數,即(EST)
在進行日期時間工作時,請不要輕描淡寫。 而不是在諸如此類的值轉換為進入和離開您自己的區域的歷元參考時刻時,只需考慮UTC即可 。 可以將 UTC視為唯一的真實時間 ,所有其他時間都是該主題的變體。
因此,始終將紀元參考時刻稱為1970-01-01T00:00:00Z
,這是UTC 1970年的第一時刻,而不是任何其他時區。
(美東時間)
另外,切勿使用3-4個字母的縮寫作為時區。 以continent/region
的格式指定正確的時區名稱 ,例如America/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 諸如EST
或IST
這樣的3-4個字母的縮寫不是真實的時區,不是標准化的,甚至不是唯一的(!)。
完成這項工作的現代方法是使用java.time類。
long secondsSinceEpoch = 1_373_604_190L ;
我們將其轉換為Instant
對象。 Instant
類以UTC表示時間軸上的時刻,分辨率為納秒 (最多十進制的九(9)位數字)。
Instant instant = Instant.ofEpochSeconds( secondsSinceEpoch ) ;
要通過某個壁鍾時間查看此值,請應用時區作為ZoneId
以獲取ZonedDateTime
對象。
我猜想, EST
是指美國和加拿大許多東部地區使用的時區。 我將任意選擇時區America/New_York
。
ZoneId z = ZoneId.of( "America/New_York" );
ZonedDateTime zdt = instant.atZone( "America/New_York" );
秒始於史詩:1373604190
Instant.toString():2013-07-12T04:43:10Z
zdt.toString():2013-07-12T00:43:10-04:00 [美國/紐約]
請參閱IdeOne.com上的實時代碼 。
要生成一個字符串,可以使java.time自動本地化,也可以指定一個顯式的格式化模式。
Locale locale = Locale.CANADA ;
DateTimeFormatter formatterLocalized = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( locale );
String outputLocalized = zdt.format( formatterLocalized );
2013年7月12日上午12:43:10
DateTimeFormatter formatterCustom = DateTimeFormatter.ofPattern( "dd MMM uuuu HH:mm:ss" , locale );
String output = zdt.format( formatterCustom );
2013年7月12日00:43:10
java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.Date
, Calendar
和SimpleDateFormat
。
現在處於維護模式的Joda-Time項目建議遷移到java.time類。
要了解更多信息,請參見Oracle教程 。 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310 。
在哪里獲取java.time類?
ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如Interval
, YearWeek
, YearQuarter
,和更多 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.