java.time.LocalDateTime(也称为ZoneDateTime)。在减去1个月后返回一年失败,格式为

java.time.LocalDateTime(也称为ZoneDateTime)。在减去1个月后返回一年失败,格式为,java,Java,我正在这么做 import java.time.LocalDateTime import java.time.temporal.ChronoUnit LocalDateTime doy = LocalDateTime.now(); LocalDateTime d = LocalDateTime.of(doy.getYear(), doy.getMonth(), doy.getDayOfMonth(),0,0,0,0); d.plus(-1,ChronoUnit.MONTHS); return

我正在这么做

import java.time.LocalDateTime
import java.time.temporal.ChronoUnit


LocalDateTime doy = LocalDateTime.now();
LocalDateTime d = LocalDateTime.of(doy.getYear(), doy.getMonth(), doy.getDayOfMonth(),0,0,0,0);
d.plus(-1,ChronoUnit.MONTHS);
return d.atZone(ZoneOffset.systemDefault()).withZoneSameInstant(ZoneOffset.UTC).format(DateTimeFormatter.ofPattern("YYYY-MM-dd'T'HH:mm:ss.SSSX"))
d
包含
2016-12-28T08:00:00.000Z
我想获得
2015-12-28T00:00:00.000Z

System.out.println(d.minusMonths(1).format(DateTimeFormatter.ofPattern("YYYY-MM-dd'T'HH:mm:ss.SSSX")));
我在mac OSX上
JavaSE81.8.0\u45
也尝试了
JavaSE81.8.0\u72

我做错了什么

在此处添加更多解释

显然,我的部分问题与格式有关

ZonedDateTime doy = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime d = ZonedDateTime.of(LocalDateTime.of(doy.getYear(), doy.getMonth(), doy.getDayOfMonth(),0,0,0,0),ZoneOffset.UTC);
System.out.println(d);
System.out.println(d.plus(-1,ChronoUnit.MONTHS));
System.out.println(d.minusMonths(1));
System.out.println(d.plus(-1,ChronoUnit.MONTHS).format(DateTimeFormatter.ofPattern("YYYY-MM-dd'T'HH:mm:ss.SSSX")));
输出

2016-01-28T00:00Z
2015-12-28T00:00Z
2015-12-28T00:00Z
2016-12-28T00:00:00.000Z
2015-12-28T00:00:00.000Z
最后一个应该是
2015-12-28:00:00.000Z

System.out.println(d.minusMonths(1).format(DateTimeFormatter.ofPattern("YYYY-MM-dd'T'HH:mm:ss.SSSX")));

给出相同的结果

您可以执行以下操作:

LocalDateTime doy = LocalDateTime.now();
LocalDateTime d = doy.minusYears(1);
然后

LocalDateTime d2 = d.minusMonth(1);
return d2;
来自API java 8():

返回此LocalDateTime的副本,其中包含指定数量的 减去年数

d.d.

返回此LocalDateTime的副本,其中包含指定数量的 减去月份


您可以这样做:

LocalDateTime doy = LocalDateTime.now();
LocalDateTime d = doy.minusYears(1);
然后

LocalDateTime d2 = d.minusMonth(1);
return d2;
来自API java 8():

返回此LocalDateTime的副本,其中包含指定数量的 减去年数

d.d.

返回此LocalDateTime的副本,其中包含指定数量的 减去月份


由于您想向后倒退一个月,因此您应该这样做,例如:

LocalDateTime d = LocalDateTime.of(2016, Month.JANUARY, 28, 0, 0, 0);
System.out.println(d);
System.out.println(d.minusMonths(1));

由于您想向后倒退一个月,因此您应该这样做,例如:

LocalDateTime d = LocalDateTime.of(2016, Month.JANUARY, 28, 0, 0, 0);
System.out.println(d);
System.out.println(d.minusMonths(1));

我想你是在找医生(…)。我从来没有用过“加号”法。

我想你在找d。我从未使用过“加号”方法。

我找到了解决问题的方法

ZonedDateTime doy = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime d = ZonedDateTime.of(LocalDateTime.of(doy.getYear(), doy.getMonth(), doy.getDayOfMonth(),0,0,0,0),ZoneOffset.UTC);

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.appendValue(ChronoField.YEAR).append(DateTimeFormatter.ofPattern("-MM-dd'T'HH:mm:ss.SSSX"));
DateTimeFormatter formatter = builder.toFormatter();

System.out.println(d.plus(-1,ChronoUnit.MONTHS).format(formatter));
输出

2016-01-28T00:00Z
2015-12-28T00:00Z
2015-12-28T00:00Z
2016-12-28T00:00:00.000Z
2015-12-28T00:00:00.000Z
所以我猜模式的模式
DateTimeFormatter.ofPattern(“YYYY-MM-dd'T:HH:MM:ss.SSSX”)

实际上,这种模式的格式化
DateTimeFormatter.of(“yyyy-MM-dd'T:HH:MM:ss.SSSX”)
是有效的

该死


任何人都可以解释为什么我的考试昨天通过了,而不是今天,1月28日有什么特别的吗?

我找到了解决问题的办法

ZonedDateTime doy = ZonedDateTime.now(ZoneOffset.UTC);
ZonedDateTime d = ZonedDateTime.of(LocalDateTime.of(doy.getYear(), doy.getMonth(), doy.getDayOfMonth(),0,0,0,0),ZoneOffset.UTC);

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.appendValue(ChronoField.YEAR).append(DateTimeFormatter.ofPattern("-MM-dd'T'HH:mm:ss.SSSX"));
DateTimeFormatter formatter = builder.toFormatter();

System.out.println(d.plus(-1,ChronoUnit.MONTHS).format(formatter));
输出

2016-01-28T00:00Z
2015-12-28T00:00Z
2015-12-28T00:00Z
2016-12-28T00:00:00.000Z
2015-12-28T00:00:00.000Z
所以我猜模式的模式
DateTimeFormatter.ofPattern(“YYYY-MM-dd'T:HH:MM:ss.SSSX”)

实际上,这种模式的格式化
DateTimeFormatter.of(“yyyy-MM-dd'T:HH:MM:ss.SSSX”)
是有效的

该死

任何人都可以解释为什么我的考试是昨天通过的,而不是今天,1月28日有什么特别之处?

YYYY是“年-周”样式日期的年值,如2006W52。如果所述周跨越年份边界,则可能会偏离纪年值+1或-1。看起来您选择了今年的最后一周

另请参见:

yyy是“年-周”样式日期的年值,如2006W52所示。如果所述周跨越年份边界,则可能会偏离纪年值+1或-1。看起来您选择了今年的最后一周


另请参见:

Actual LocalDateTime d=LocalDateTime.of(2016年1月28日,0日,0日,0日);系统输出打印ln(d);系统输出打印项数(d.plus(-1,ChronoUnit.MONTHS))系统输出打印项数(d.minus MONTHS(1));工作正常。实际上LocalDateTime d=LocalDateTime.of(2016年1月28日,0日,0日);系统输出打印ln(d);系统输出打印项数(d.plus(-1,ChronoUnit.MONTHS))系统输出打印项数(d.minus MONTHS(1));工作正常。请参见上面的加法。我的代码从字符串中获取要添加或删除的内容,因此它与执行d.plus(1,ChronoUnit.YEARS)或d.plus(-1,ChronoUnit.MONTHS))的代码相同,这在这里不是问题,因为d.plus(-1,ChronoUnit.MONTHS))给出的结果与d.minusMonth(1)相同请参见上面的加法。我的代码从字符串中获取要添加或删除的内容,因此它与执行d.plus(1,ChronoUnit.YEARS)或d.plus(-1,ChronoUnit.MONTHS))的代码相同,这在这里无论如何都不是问题,因为d.plus(-1,ChronoUnit.MONTHS))给出的结果与d.minusMonth(1)相同