2017-07-23 64 views
0

這是我的代碼轉換大紀元日期在日期時間格式1980-01-01

private Date getReferenceDate(int seg) { 

    switch (seg) { 
     case 1: 
     case 2: 
     case 3: 
      return new Date(1980-01-01); 
     case 31: 
     case 32: 
     case 33: 
      return new Date(1970-01-01); 
     default: 
      return new Date(1980-01-01); 
    } 
} 

private Date getDateFormat(int time, int seg) { 
    Date date = getBaseReferenceDate(seg); 
    date.setSeconds(date.getSeconds() + time); 
    date.setHours(date.getHours() - 5); 
    date.setMinutes(date.getMinutes() - 30); 
    date.setSeconds(date.getSeconds()-1); 
    return date; 
} 

我在1185106460格式 我想將它轉換爲2017年7月21日12點14分二十秒這個日期格式 我得到錯誤的輸出1980-01-01

+0

這還不清楚,對不起。你的意思是說,如果'seg'是1,2或3,那麼你想添加1185106460秒到1980-01-01的基數?然後對時區進行一些調整?我只是在這裏做鬼臉。 –

+0

如果seg是1,2,3我想要日期格式1980-01-01 1185106460是時間通過date.setSeconds(date.getSeconds()+ time); date.setHours(date.getHours() - 5); date.setMinutes(date.getMinutes() - 30); date.setSeconds(date.getSeconds() - 1); – skIndia

+0

它沒有讓它更清晰。同樣你想要的格式只包括日期,但你說你想要的結果也包括一天的時間。你真的想要哪個? –

回答

-1

您可以通過以下步驟轉換日期長日期:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
String date=dateFormat.format(new Date(long timeInMillis)); 
2

我認爲下面是你想要的。

即使你在Android上,因此沒有內置的現代Java日期和時間API,我使用它是因爲它更方便,特別是對於這種操作。你可以在ThreeTenABP得到它,參見How to use ThreeTenABP in Android Project

private static OffsetDateTime getReferenceDate(int seg) { 
    int baseYear = 1970; 
    if (seg >= 31 && seg <= 33) { 
     baseYear = 1980; 
    } 
    return OffsetDateTime.of(LocalDate.of(baseYear, Month.JANUARY, 1), 
          LocalTime.MIDNIGHT, 
          ZoneOffset.UTC); 
} 

private static OffsetDateTime getDateFormat(int time, int seg) { 
    return getReferenceDate(seg).plusSeconds(time); 
} 

見它的工作:

System.out.println(getDateFormat(1185106460, 1)); 

此打印:

2007-07-22T12:14:20Z 

這是日期和時間,你提出的要求。

如果你只想要日期YYYY-MM-DD格式:

System.out.println(getDateFormat(1185106460, 1) 
      .format(DateTimeFormatter.ISO_LOCAL_DATE)); 

這將打印

2007-07-22 

如果你需要一個過時的Date對象,例如對於一些傳統的API,你不能改變:

System.out.println(DateTimeUtils.toDate(getDateFormat(1185106460, 1).toInstant())); 

在我的電腦上打印:

Sun Jul 22 14:14:20 CEST 2007 

這是相同的時間點,只有Date.toString()將其格式化爲JVM的時區設置。在Java 8或更高版本的轉換將是

System.out.println(Date.from(getDateFormat(1185106460, 1).toInstant())); 

什麼是你做錯了什麼?首先,您在Date中使用了已棄用的方法。這些由於某種原因而被棄用,它們在不同時區不可靠,所以你不想使用它們。您可能也打算使用其中一個已棄用的Date構造函數,但您使用的是不推薦使用的構造函數。 1980-01-01是一個有兩個減法的算術表達式。 01是一個值爲1的八進制整數字面值,因此表達式的結果爲1978.您將1978傳入構造函數Date(long date),在這裏它們被解釋爲自時間1970-01-01T00:00:00Z以來的毫秒數。

如果您打算提及所提到的時代作爲參考,您會接近,僅1968毫秒。我懷疑你最後減去1秒是爲了彌補這一點。如果您打算使用1980年的參考資料,那麼您需要10年的時間,節省1978毫秒。這導致了這個問題。

在任何情況下,Date已經過時了很久,不適合您正在嘗試做的事情。正如我所說,我推薦ThreeTenABP。如果你真的,真的不想依賴外部庫(僅在現代API進入Android之前),你可以查看Calendar和/或GregorianCalendar類,但是它們很麻煩並且錯誤,只是需要警告。

+1

非常感謝先生,我可以理解我的錯誤 – skIndia