Java 转换时的时间转换问题添加一天额外时间
我试图转换时区,但它增加了一天额外的java函数Java 转换时的时间转换问题添加一天额外时间,java,timezone,java-7,datetime-format,Java,Timezone,Java 7,Datetime Format,我试图转换时区,但它增加了一天额外的java函数 "" deActivationDate=2021-06-25T23:59:59.000+0000""; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); try { Date date =formatter.parse(deA
"" deActivationDate=2021-06-25T23:59:59.000+0000"";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
try {
Date date =formatter.parse(deActivationDate);
deActivationDate=formatter.format(date);
LOGGER.info("time format printing 1" +deActivationDate);//2021-06-26T04:29:59.000+0430
deActivationDate = deActivationDate.substring(0, deActivationDate.length()-2)+":30";
LOGGER.info("time format printing 2" +deActivationDate);//2021-06-26T04:29:59.000+04:30""
在上面的停用日期是25,当我提供输入时,但在格式化程序parase方法之后,其转换为26为什么有一天操作系统会添加如何避免它。以下是代码的修复方法。尽管我们建议不要使用子字符串方法
String deActivationDate="2021-06-25T23:59:59.000+0000";
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date =formatter.parse(deActivationDate);
deActivationDate=formatter.format(date);
System.out.println("time format printing 1: " +deActivationDate);
//2021-06-25T23:59:59.000+0000
deActivationDate = deActivationDate.substring(0,
deActivationDate.length()-4)+"0430";
System.out.println("time format printing 2: " +deActivationDate);
//2021-06-25T23:59:59.000+0430
} catch (Exception e) {
System.err.println(e.getMessage());
}
感谢大家的建议@beshambher chaukhwan m,我已通过以下代码实现了更改
String deActivationDate="2021-06-25T23:59:59.000+0000";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
try {
formatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date =formatter.parse(deActivationDate);
deActivationDate=formatter.format(date);
if(TimeZone.getDefault().useDaylightTime()) {
deActivationDate = deActivationDate.substring(0, deActivationDate.length()-4)+"04:30";
}else {
deActivationDate = deActivationDate.substring(0, deActivationDate.length()-4)+"03:30";
}
java.time通过Three-Ten Backport
您应该认真考虑使用Java.Times,即现代java日期和时间API,用于非平凡的日期和时间工作。 您的问题不太清楚,但我认为您希望将日期和时间字符串转换为您自己时区(在本例中为亚洲/德黑兰时区)中的相同日期和挂钟时间。因此,一个不同的时间点:在伊朗接近一天的结束,而不是在UTC接近一天的结束。并在UTC偏移量中使用冒号
我声明了两个格式化程序,一个用于不带冒号的解析,另一个用于带冒号的格式化: 现在,您的转换如下所示: String deActivationDate = "2021-06-25T23:59:59.000+0000";
OffsetDateTime dateTime = OffsetDateTime.parse(deActivationDate, PARSER);
deActivationDate = dateTime.atZoneSimilarLocal(ZoneId.systemDefault())
.format(PRINTER);
System.out.println("time format printing: " +deActivationDate);
输出在Java 1.7.0_67上进行了测试,有三个后端端口版本1.3.6:
时间格式打印:2021-06-25T23:59:59+04:30
Java知道亚洲/德黑兰时区在6月25日使用夏季时间(DST),因此转换并打印所需的偏移量+04:30
。如果日期是一年中的标准时间部分,则会打印出+03:30
不打印0毫秒,这在大多数情况下是一个优势。格式为ISO 8601,根据ISO 8601标准,秒的分数为0时是可选的。如果需要millis,请使用此更简单的格式化程序:
private static final DateTimeFormatter PRINTER
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");
时间格式打印:2021-06-25T23:59:59.000+04:30
半开放:您不应在新的一天开始前1秒表示一天的结束。首先,这是错误的:一天不会在结束前一秒钟结束。第二,它可能会导致错误,因为时间落在最后一秒之内,因此在程序中既不属于某一天也不属于另一天。即使这种情况在实践中没有发生,您也会让程序员浪费时间去思考它是否会发生。相反,将一天的结束表示为第二天的第一个时刻(通常为00:00)。测试时,要求时间必须严格在一天结束前属于一天。这种方法适用于所有类型的时间间隔,当然也适用于时间间隔。它们被称为半开放间隔
问:java.time不需要Java8吗?
time在Java7上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
- 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
- 在较旧的Android上,可以使用desugaring或Android版本的ThreeTen Backport。它叫ThreeTenABP。在后一种情况下,请确保使用子包从
导入日期和时间类org.threeten.bp
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
formatter.setTimeZone(timezone.getTimeZone(“UTC”)
这是否回答了您的问题?你说得很对,但过了一段时间后,时区将更改为03:30,因此我们不希望在代码中手动更改,这就是我们没有添加子字符串的原因。请检查此问题。我强烈建议使用Java 6+的人使用此答案。这将使代码在将来升级到更高版本的Java时易于移植。答案是不正确的。它全年打印+04:30
。伊朗将回到标准时间,并在2021年9月22日抵消+03:30。我用字符串2021-11-25T23:59:59.000+0000
尝试了您的代码,但仍然得到时间格式打印1:2021-11-25T23:59:59.000+04:30
。useDaylightTime
方法只告诉您时区使用夏令时(夏季),而不是一年中的哪个部分使用夏令时,因此它总是返回true。
private static final DateTimeFormatter PRINTER
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx");