乔达时间plusDays错误的日期 [英] Joda time plusDays getting wrong date

查看:103
本文介绍了乔达时间plusDays错误的日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用此代码:

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆