乔达时间plusDays错误的日期 [英] Joda time plusDays getting wrong date
问题描述
我正在使用此代码:
DateTime(date)// Thu Aug 06 00:00:00 GMT + 03:00 2020
.plusDays(days)// 103
.toDate()
结果为 Fri Dec 18 23:00:00 GMT + 02:00 2020
而不是 Dec 19
。
某些日期可以很好地工作,而其他日期可以是date-1,我想问题出在一个月中的天数,但是 plusDays()
没有
在某些日期下效果很好,而其他日期效果为date-1,我想
的问题是一个月中的天数,但是plusDays()不是
考虑吗?
考虑一下。您提到的两个日期时间字符串的问题在于它们属于不同的Zone-Offset(第一个是UTC + 3,第二个是UTC + 2)。
import org.joda.time.DateTime;以下是在相同的区域偏移量下的处理方法。
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
公共类Main {
public static void main(String [] args){
DateTimeFormatter formatter = DateTimeFormat.forPattern( EEE MMM dd HH:mm:ss zZ yyyy ;);
DateTime dateTime = DateTime.parse( Thu Aug 06 00:00:00 GMT + 03:00 2020,formatter);
System.out.println(dateTime);
//具有UTC + 2的区域偏移量
System.out.println(dateTime.withZone(DateTimeZone.forOffsetHours(2)));
//添加103天
DateTime dateTimeAfter103Days = dateTime.plusDays(103);
System.out.println(dateTimeAfter103Days);
System.out.println(dateTime.withZone(DateTimeZone.forOffsetHours(2)));
}
}
输出:
2020-08-05T21:00:00.000Z
2020-08-05T23:00:00.000 + 02:00
2020-11-16T21 :00:00.000Z
2020-08-05T23:00:00.000 + 02:00
我建议您使用
具有现代日期时间API :
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
公共类Main {
public static void main(String [] args){
//为日期时间字符串定义格式化程序
DateTimeFormatter formatter = DateTimeFormatter。 ofPattern( EEE MMM dd HH:mm:ss O u);
//将给定的date0时间字符串解析为OffsetDateTime对象
OffsetDateTime dateTime = OffsetDateTime.parse( Thu Aug 06 00:00:00 GMT + 03:00 2020,格式化程序);
System.out.println(dateTime);
//将103天添加到OffsetDateTime对象
OffsetDateTime dateTimeAfter103Days = dateTime.plusDays(103);
System.out.println(dateTimeAfter103Days);
}
}
输出:
2020-08-06T00:00 + 03:00
2020-11-17T00:00 + 03:00
或者
import java.time.LocalDateTime ;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
公共类Main {
public static void main(String [] args){
//为日期时间字符串定义格式化程序
DateTimeFormatter formatter = DateTimeFormatter。 ofPattern( EEE MMM dd HH:mm:ss z yyyy);
//如果不需要区域ID或区域偏移信息,则可以使用
// LocalDateTime
LocalDateTime dateTime = LocalDateTime.parse( Thu Aug 06 00 :00:00 GMT + 03:00 2020,格式化程序);
System.out.println(dateTime);
//您可以通过应用
// Zone-Offset例如将LocalDateTime对象转换为OffsetDateTime。下一行将UTC + 03:00小时应用于LocalDateTime
OffsetDateTime odt = dateTime.atOffset(ZoneOffset.ofHours(3));
System.out.println(odt);
//将103天添加到LocalDateTime对象
LocalDateTime dateTimeAfter103Days = dateTime.plusDays(103);
System.out.println(dateTimeAfter103Days);
odt = dateTimeAfter103Days.atOffset(ZoneOffset.ofHours(3));
System.out.println(odt);
}
}
输出:
2020-08-06T00:00
2020-08-06T00:00 + 03:00
2020-11-17T00:00
2020-11-17T00:00 + 03:00
I am using this code:
DateTime(date)//Thu Aug 06 00:00:00 GMT+03:00 2020
.plusDays(days) // 103
.toDate()
And the result is Fri Dec 18 23:00:00 GMT+02:00 2020
instead of Dec 19
.
With some dates it work well, with other the result date-1, I guess the problem is with number of days in month, but does plusDays()
not consider it?
With some dates it work well, with other the result date-1, I guess the problem is with number of days in month, but does plusDays() not consider it?
It does consider it. The problem with the two date-time strings you have mentioned is that they belong to different Zone-Offset (the first one is with UTC+3 and the second one with UTC+2). Given below is how to do it with the same Zone-Offset.
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss zZ yyyy");
DateTime dateTime = DateTime.parse("Thu Aug 06 00:00:00 GMT+03:00 2020", formatter);
System.out.println(dateTime);
// With Zone-Offset of UTC+2
System.out.println(dateTime.withZone(DateTimeZone.forOffsetHours(2)));
// Add 103 days
DateTime dateTimeAfter103Days = dateTime.plusDays(103);
System.out.println(dateTimeAfter103Days);
System.out.println(dateTime.withZone(DateTimeZone.forOffsetHours(2)));
}
}
Output:
2020-08-05T21:00:00.000Z
2020-08-05T23:00:00.000+02:00
2020-11-16T21:00:00.000Z
2020-08-05T23:00:00.000+02:00
I recommend you use the modern java.time
date-time API and the corresponding formatting API (package, java.time.format
). Learn more about the modern date-time API from Trail: Date Time. If your Android API level is still not compliant with Java8, check How to use ThreeTenABP in Android Project and Java 8+ APIs available through desugaring.
The following table shows an overview of modern date-time classes:
With modern date-time API:
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Define formatter for your date-time string
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss O u");
// Parse the given date0-time string into OffsetDateTime object
OffsetDateTime dateTime = OffsetDateTime.parse("Thu Aug 06 00:00:00 GMT+03:00 2020", formatter);
System.out.println(dateTime);
// Add 103 days to the OffsetDateTime object
OffsetDateTime dateTimeAfter103Days = dateTime.plusDays(103);
System.out.println(dateTimeAfter103Days);
}
}
Output:
2020-08-06T00:00+03:00
2020-11-17T00:00+03:00
Alternatively,
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Define formatter for your date-time string
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss z yyyy");
// If you do not need Zone Id or Zone Offset information, you can go for
// LocalDateTime
LocalDateTime dateTime = LocalDateTime.parse("Thu Aug 06 00:00:00 GMT+03:00 2020", formatter);
System.out.println(dateTime);
// You can convert LocalDateTime object into an OffsetDateTime by applying the
// Zone-Offset e.g. the following line applies UTC+03:00 hours to LocalDateTime
OffsetDateTime odt = dateTime.atOffset(ZoneOffset.ofHours(3));
System.out.println(odt);
// Add 103 days to the LocalDateTime object
LocalDateTime dateTimeAfter103Days = dateTime.plusDays(103);
System.out.println(dateTimeAfter103Days);
odt = dateTimeAfter103Days.atOffset(ZoneOffset.ofHours(3));
System.out.println(odt);
}
}
Output:
2020-08-06T00:00
2020-08-06T00:00+03:00
2020-11-17T00:00
2020-11-17T00:00+03:00
这篇关于乔达时间plusDays错误的日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!