[英]Generate string of yesterday’s date-time in ISO 8601 format
在Android中,我正在使用java.util.Calendar
以yyyy-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已經涉及到所有三個,但是我認為其中的兩個可以更清晰一些:
HH
。 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.