乔达时间加星期四的日期搞错了

z9gpfhce  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(342)

我正在使用此代码:

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 . 对于某些日期,它工作得很好,而对于另一个结果日期-1,我猜问题在于月份中的天数,但确实如此 plusDays() 不考虑吗?

yrefmtwq

yrefmtwq1#

对于某些日期,它工作得很好,而另一些日期是结果日期-1,我猜问题在于月份中的天数,但是plusdays()不考虑它吗?
它确实考虑过。您提到的两个日期时间字符串的问题是它们属于不同的区域偏移(第一个是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;

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)));
    }
}

输出:

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

我建议你用现代的 java.time 日期时间api和相应的格式化api(包, java.time.format ). 从trail:date-time了解有关现代日期时间api的更多信息。如果您的android api级别仍然与java8不兼容,请检查如何在android项目中使用threetenabp,以及通过desugaring提供的java8+api。
下表显示了现代日期时间类的概述:

使用现代日期时间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);
    }
}

输出:

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;

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);
    }
}

输出:

2020-08-06T00:00
2020-08-06T00:00+03:00
2020-11-17T00:00
2020-11-17T00:00+03:00
xfyts7mz

xfyts7mz2#

你可以用 java.time 而且它在较低的android api中也得到了支持,因为android中现在有了api设计。
有一个区域感知类( java.time.ZonedDateTime )和一个偏移感知的( java.time.OffsetDateTime ),但是你的例子 String 只包含gmt/utc的偏移量。所以我才会用 OffsetDateTime 解析出准确的时间,然后加上一天。
下面是一个简单的示例,它定义了一个格式化程序来解析给定的 String 并将其用于输出:

public static void main(String[] args) {
    // example String
    String date = "Fri Dec 18 23:00:00 GMT+02:00 2020";
    // create a formatter that is able to parse and output the String
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss OOOO uuuu",
                                                        Locale.ENGLISH);
    // parse the String using the formatter defined above
    OffsetDateTime odt = OffsetDateTime.parse(date, dtf);
    System.out.println("OffsetDateTime parsed is\t" + odt.format(dtf));

    // add a day to the date part
    OffsetDateTime dayLater = odt.plusDays(1);
    System.out.println("Adding a day results in\t\t" + dayLater.format(dtf));
}

这个输出

OffsetDateTime parsed is    Fri Dec 18 23:00:00 GMT+02:00 2020
Adding a day results in     Sat Dec 19 23:00:00 GMT+02:00 2020

如果您只对输出日期感兴趣(没有时间部分或偏移量),那么在这些类中还有另一个方便的方法,那就是简单地提取日期或时间部分。您可以使用 OffsetDateTime ,例如:

// extract the part that only holds information about day of month, month of year and year
LocalDate dateOnly = odt.toLocalDate();
// print the default format (ISO standard)
System.out.println(dateOnly);
// or define and use a totally custom format
System.out.println(dateOnly.format(
                        DateTimeFormatter.ofPattern("EEEE, 'the' dd. 'of' MMMM uuuu",
                                                    Locale.ENGLISH)
                    )
);

这将产生

2020-12-18
Friday, the 18. of December 2020

以防你遇到 DatePicker datePicker ,您可以通过 getYear() , getMonth() 以及 getDayOfMonth() ,然后创建

LocalDate localDate = LocalDate.of(datePicker.getYear(),
                                   datePicker.getMonth(), 
                                   datePicker.getDayOfMonth());

然后简单地添加一天 localDate.plusDays(1);

相关问题