簡體   English   中英

將日期字符串解析為“ yyyy-MM-dd'T'HH:mm:ss'-'hh:mm”時,小時,分鍾和米的值錯誤

[英]Wrong value for hour, minutes and mills when parsing date string to “yyyy-MM-dd'T'HH:mm:ss'-'hh:mm”

我已經嘗試了一段時間的不同格式。 但是在將日期字符串解析為日期時遇到了一個問題。

這是我要解析的示例日期字符串。 “ 2015-04-13T10:17:00-04:00”

這是我的代碼:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'-'hh:mm", Locale.ENGLISH);
            try {
                startCal.setTime(format.parse(data.StartTime));
                endCal.setTime(format.parse(data.EndTime));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

我在日志上打印時得到的值是

Log.i("Event exact date", String.valueOf(startCal.getTime().toString()));

04-13 22:38:11.526: I/Event exact date(1665): Mon Apr 13 04:00:00 GMT+08:00 2015

我期望小時值為10,分鍾為17。我認為它是從“ -hh:mm”獲得值的。 我從Web API獲得此值。 有想法嗎? 謝謝

我認為您想要的格式是:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);

根據SimpleDateFormat API文檔 ,“ XXX”表示ISO 8601時區。

完整示例:

public class TestDateParse {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX", Locale.ENGLISH);

        Date date = format.parse("2015-04-13T10:17:00-04:00");
        System.out.println("date: " + date);
    }
}

測試輸出:

date: Mon Apr 13 16:17:00 CEST 2015

如果您不需要“ -04:00”區域偏移(時區),則只需將字符串“ 2015-04-13T10:17:00-04:00”截斷為“ 2015-04-13T10:17:00”

        String fullDate = "2015-04-13T10:17:00-04:00";
        String truncatedDate = fullDate.substring(0, fullDate.lastIndexOf('-'));

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss",
                Locale.ENGLISH);
        try {

            Date dte = format.parse(truncatedDate);
            System.out.println("date=" + dte);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

結果是:

日期= 2015年4月13日星期一10:17:00

使用Z作為時區。 它應該工作。

 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

供參考,這是文檔http://developer.android.com/reference/java/text/SimpleDateFormat.html

java.time

您正在使用麻煩的舊日期時間類。 避免他們。

使用Java 8和更高版本中內置的java.time框架。 Joda-Time啟發,由JSR 310定義,並由ThreeTen-Extra項目擴展。 尋找Java 6和7以及Android的反向端口。

您的輸入字符串恰好是標准ISO 8601格式。 解析/生成日期時間值的文本表示時,java.time類使用ISO 8601作為其默認值。 因此,無需指定格式化模式。

偏移量

正如其他答案中所述,最后一部分-04:00確實是自UTC偏移量 這意味着顯示的日期時間比UTC晚四個小時。

String input = "2015-04-13T10:17:00-04:00";
OffsetDateTime odt = OffsetDateTime.parse( input );

時區

您可以搜索時區列表,以查看哪些時區使用-04:00特定偏移量。 我看到了幾十個具有該偏移量的區域。

如果您知道預期的時區,請應用它( ZoneId )。 時區從UTC偏移的時間, 再加上用於處理異常的規則,例如夏令時(DST) 因此,只要您確定正確的時區,使用時區總是比單純的偏移更好。

ZoneId zoneId = ZoneId.of( "America/Puerto_Rico" );
ZonedDateTime zdt = odt.atZoneSameInstant( zoneId );

世界標准時間

上面顯示的OffsetDateTimeZonedDateTime對象表示時間軸上的同一時刻。 如果您想在UTC中查看該時刻,例如Instant

Instant instant = odt.toInstant();  // …or…
Instant instant = zdt.toInstant();  // Both instants are the same moment on the timeline in UTC.

暫無
暫無

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

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