toinstant()java返回错误的值

qc6wkl3g  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(264)

我想得到一个即时对象的开始和结束本月。为了完整性,我可以说我需要它们从数据库中获取一些对象(spring数据)。

Optional<List<Object» findAllByObjectAndStateChangeDateBetween(Object partner, Instant start, Instant end);

当然,我在当前月份的开始和结束日期发现了这个
但我写了

begining = calendar.getTime().toInstant();

开始=2020-08-31t19:00:00z结束=2020-09-30t18:59:59.999z
bui i just want begining=2020-09-01t00:00:01z end=2020-09-30t23:59:59.999z我只想开始=2020-09-01t00:00:01z结束=2020-09-30t23:59:59.999z

slhcrj9b

slhcrj9b1#

转换 Calendar 对象到Java8+TimeAPI的对象,保留 Calendar 对象,使用:

ZonedDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId())

要显示如何正确保留所有字段值,请执行以下操作:

TimeZone.setDefault(TimeZone.getTimeZone("Asia/Yekaterinburg"));

Calendar cal = Calendar.getInstance();
ZonedDateTime zdt = ZonedDateTime.ofInstant(cal.toInstant(), cal.getTimeZone().toZoneId());
System.out.println("java.util.Date: " + new SimpleDateFormat("MMM d, yyyy, h:mm:ss.SSS a XXX").format(cal.getTime()));
System.out.println("ZonedDateTime : " + DateTimeFormatter.ofPattern("MMM d, uuuu, h:mm:ss.SSS a XXX").format(zdt));

System.out.println();
System.out.printf("%-12s%-20s%s%n", "Field"     , "Calendar"                    , "ZonedDateTime");
System.out.printf("%-12s%-20d%d%n", "Year"      , cal.get(Calendar.YEAR)        , zdt.getYear());
System.out.printf("%-12s%-20d%d%n", "Month"     , cal.get(Calendar.MONTH)       , zdt.getMonthValue());
System.out.printf("%-12s%-20d%d%n", "Day"       , cal.get(Calendar.DAY_OF_MONTH), zdt.getDayOfMonth());
System.out.printf("%-12s%-20d%d%n", "Hour"      , cal.get(Calendar.HOUR_OF_DAY) , zdt.getHour());
System.out.printf("%-12s%-20d%d%n", "Minute"    , cal.get(Calendar.MINUTE)      , zdt.getMinute());
System.out.printf("%-12s%-20d%d%n", "Second"    , cal.get(Calendar.SECOND)      , zdt.getSecond());
System.out.printf("%-12s%-20d%d%n", "Milli/Nano", cal.get(Calendar.MILLISECOND) , zdt.getNano());
System.out.printf("%-12s%-20s%s%n", "Time Zone" , cal.getTimeZone().getID()     , zdt.getZone().getId());
System.out.printf("%-12s%-20s%d%n", "  Offset"  , cal.getTimeZone().getOffset(cal.getTimeInMillis()), zdt.getOffset().getTotalSeconds());

System.out.println();
System.out.println("Instant (same real time) : " + zdt.toInstant());
System.out.println("Instant (same local time): " + zdt.withZoneSameLocal(ZoneOffset.UTC).toInstant());

输出

java.util.Date: Sep 4, 2020, 4:20:32.475 PM +05:00
ZonedDateTime : Sep 4, 2020, 4:20:32.475 PM +05:00

Field       Calendar            ZonedDateTime
Year        2020                2020
Month       8                   9
Day         4                   4
Hour        16                  16
Minute      20                  20
Second      32                  32
Milli/Nano  475                 475000000
Time Zone   Asia/Yekaterinburg  Asia/Yekaterinburg
  Offset    18000000            18000

Instant (same real time) : 2020-09-04T11:20:32.475Z
Instant (same local time): 2020-09-04T16:20:32.475Z

请注意 Calendar 月份值以0为基础。这是我们不再使用它的众多原因之一。

相关问题