簡體   English   中英

Java和Android中的SimpleDateFormat是否不同?

[英]Is SimpleDateFormat in Java and Android different?

  1. 當我們從JVM調用parseJavaAndroid("2018-04-27T22:31:07.962-05:00") ,它會給出ParseException而從Emulator / Android Real設備進行的調用則可以正常工作。

  2. 當我們將SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", Locale.ENGLISH)更改為SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH) Android SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX", Locale.ENGLISH)中,它會拋出:

    消息為“未知模式字符'X'方法”的IllegalArgumentException。

    它在JVM中運行良好,並在Emulator / Android Real設備中提供ParseException

public static Date parseJavaAndroid(String fromDate){
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ", Locale.ENGLISH);
    Date date=null;
    try {
        date = format.parse(fromDate);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;
}

然后它應該在JVM和android實時設備( minSdkVersion:19 )中都可以工作。 我想要適用於Android和Java的 “ 2018-04-27T22:31:07.962-05:00”模式。

注意: 個體模式正在運行 ,所以請不要為個體提供建議。

我說不清Android,但是在JVM中, Z模式只能識別不帶:偏移量,例如-0500 ,而X模式可以識別-05:00https : //docs.oracle.com/javase/ 7 /文檔/ API / JAVA /文本/ SimpleDateFormat.html

也許Android有一個不同的實現,其中Z還可以識別帶有:偏移量,例如-05:00

恐怕沒有一種萬能的解決方案: Z在JVM中不起作用, X在Android中不起作用,如何使其在兩種環境中都能起作用? 我認為您最好的辦法是嘗試兩種模式,如下所示(用偽代碼):

try {
    parse with X
} catch(Exception e) {
    X didn't work, parse with Z
}

更理想的辦法是使用threeten反向移植 ,並與配置ThreetenABP -或使用java.time ,如果你的API級別為26:

// parse input
OffsetDateTime odt = OffsetDateTime.parse("2018-04-27T22:31:07.962-05:00");

// convert to java.util.Date (threeten backport)
Date date = DateTimeUtils.toDate(odt.toInstant());

// or, if you have java.time (API level 26)
Date date = date.from(odt.toInstant());

根據您的示例和android doc ,您應該使用X (ISO8601)而不是Z (RFC822)

給出: "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

暫無
暫無

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

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