Java 生成昨天的字符串’;s ISO 8601格式的日期时间
在Android中,我使用Java 生成昨天的字符串’;s ISO 8601格式的日期时间,java,android,date,calendar,simpledateformat,Java,Android,Date,Calendar,Simpledateformat,在Android中,我使用java.util.Calendar以yyyy-MM-dd'T'hh:MM:ss'Z'格式获取昨天的日期。例如,如果今天是2017年5月31日,我想将昨天的日期设置为2017-05-30T00:00:00Z Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Cal
java.util.Calendar
以yyyy-MM-dd'T'hh:MM:ss'Z'格式获取昨天的日期。例如,如果今天是2017年5月31日,我想将昨天的日期设置为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
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);
这里怎么了?它与时区有关吗?我的时区是GMT/UTC+08:00小时
要减去天数,您应该使用:
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -5);
这只是您的SimpleDataFormat
中的一个错误
您对小时使用hh
,但这显示了基于一小时的AM/PM
这些是相关符号(来自)
H
一天中的小时数(0-23)
k
一天中的小时数(1-24)
K
am/pm小时数(0-11)
h
am/pm小时数(1-12)
你想要这个:“yyyy-MM-dd'T'HH:MM:ss'Z'”
备注
你说你的时区是+08:00小时,你使用该时区计算日期,但是你将其格式化为Zulu时区(偏移量为+00:00)
奖金
在Java 8中,所有这些日历操作都消失了:
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);
我的回答可能比你问的要多,但现在你问了,为什么不把所有的都拿走呢?我发现你的代码有两三处错误。bowmore in已经谈到了这三个问题,但我认为其中有几个问题可以说得更清楚一些:
是的,第一个也是最严重的是与时区有关的。您需要决定并在代码中明确使用哪个时区。在时区偏移量+08:00的时间段上,将Z作为时区是不正确的。Z代表祖鲁时间,UTC的另一个名称
在格式模式中,一天中的小时应该使用大写字母HH
原则上,您应该更喜欢现代日期和时间类,但至少在这种情况下是这样的。有了这些,您将无法像使用老式的SimpleDataFormat
时那样出错
时区
时区对你的任务至关重要。您需要决定昨天的日期是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(“亚洲/香港”)
或ZoneId.systemDefault()
作为时区
如果您使用的是Java6或Java7,请使用您需要获得的现代日期和时间类。尽管在引入外部依赖之前我总是三思而后行,但我还是热情地为您的任务推荐这个
该后端端口在项目中进一步适用于Android 打印日期结束。。。在将来,写一个标题,具体概括你问题的核心。这一次我是为你做的。仅供参考,像、java.text.SimpleTextFormat
这样麻烦的旧日期时间类现在被这些类取代了。看,谢谢HH
修复了我的问题:DIt显然是正确的,在区域偏移量+8的时间上,将Z指定为时区是不正确的。我也同意人们应该更喜欢Java8解决方案,它更清晰、更方便。所需的格式是ISO 8601,这是Java 8中的默认格式,因此您可以使用Instant.toString()
或DateTimeFormatter.ISO\u Instant
,这比构建自己的格式化程序更简单、更清晰。而且,如问题所示,更不容易出错。:-)另外,Java8Date和time类也已经被更新。你没有理由不喜欢他们来完成这项任务。