簡體   English   中英

以ISO 8601格式生成昨天的日期時間字符串

[英]Generate string of yesterday’s date-time in ISO 8601 format

在Android中,我正在使用java.util.Calendaryyyy-MM-dd'T'hh:mm:ss'Z'格式獲取昨天的日期。 例如,如果今天是31 May 2017 ,我想將昨天的日期設為2017-05-30T00:00:00Z

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);

// Date End = yesterday
calendar.add(Calendar.DATE, -1);
Date dateEnd = calendar.getTime();

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
this.dateEndStr = formatter.format(dateEnd);

我期望輸出為2017-05-30T00:00:00Z 但這給了我2017-05-30T12:00:00Z

怎么了 與TimeZone相關嗎? 我的時區是GMT/UTC + 08:00 hour

我的回答可能比您要的要多,但是現在您已經問了,為什么不全部使用呢? 我發現您的代碼有兩三件事是錯的。 另一個答案中, bowmore已經涉及到所有三個,但是我認為其中的兩個可以更清晰一些:

  1. 是的,最嚴重的是時區相關的。 您需要確定,並且應該在代碼中明確說明所使用的時區。 在區域偏移量+08:00的時間上給Z作為時區是不正確的。 Z是祖魯語時間,UTC的另一個名稱。
  2. 在格式格式中,您應該在一天中的小時內使用大寫HH
  3. 從原則上講,您應該始終偏愛現代日期和時間類,但至少在這種情況下更是如此。 有了這些,您將無法做出與老式SimpleDateFormat的錯誤。

時區

時區對於您的任務至關重要。 您需要確定昨天的日期是UTC(如請求的輸出所示), GMT/UTC + 08:00還是JVM的當前時區(可以在程序運行時隨時更改)。 。 此代碼段使用UTC:

this.yesterdayAtStartOfDay = LocalDate.now(ZoneOffset.UTC)
    .minusDays(1)
    .atStartOfDay(ZoneOffset.UTC)
    .format(DateTimeFormatter.ISO_INSTANT);

現在運行它,結果是

2017-05-30T00:00:00Z

除了使用代碼段的最后一行,您還可以使用更簡單的代碼:

    .toString();

這給出了相同的結果,因為atStartOfDay()給出了時區為Z的ZonedDateTime ,而其toString()方法給出了您請求的ISO 8601字符串。

如果要在另一個時區使用昨天的日期,請在代碼段的第一行(僅第一行)中使用ZoneOffset.ofHours(8)ZoneId.of("Asia/Hong_Kong")ZoneId.systemDefault()作為時區。

如果您使用Java 6或7,要使用現代的日期和時間類,則需要獲取ThreeTen-Backport 即使在引入外部依賴項之前我總是三思而后行,但我還是為您的任務推薦了這個。

該后端口在ThreeTenABP項目中進一步適用於Android。

這只是您SimpleDateFormat一個錯誤。

您將hh用作小時,但這顯示了AM / PM的一個小時。

這些是相關的符號(來自SimpleDateFormat

  • H小時(0-23)
  • k一天中的小時(1-24)
  • K小時,上午/下午(0-11)
  • h上午/下午(1-12)

您想要這樣: "yyyy-MM-dd'T'HH:mm:ss'Z'"

備注

您說您的時區為+08:00小時,並使用該時區計算日期,但是您將其格式化為好像在Zulu時區中(偏移量為+00:00)

獎金

在Java 8中,所有這些Calendar操作都消失了:

ZonedDateTime yesterday = ZonedDateTime.now().with(ChronoField.NANO_OF_DAY, 0).minusDays(1);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
dateEndStr = formatter.format(dateEnd);

要減去天數,應使用:

Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -5);
cal.add(Calendar.DAY_OF_YEAR, -1);

暫無
暫無

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

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