簡體   English   中英

Java日期格式問題

[英]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)

tl; dr

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/MontrealAfrica/CasablancaPacific/Auckland 諸如ESTIST這樣的3-4個字母的縮寫不是真實的時區,不是標准化的,甚至不是唯一的(!)。

使用java.time

完成這項工作的現代方法是使用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.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

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

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

在哪里獲取java.time類?

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

暫無
暫無

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

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