2016-01-28 2 views
1

Я делаю этоjava.time.LocalDateTime (также ZonedDateTime). Не удается вернуть один год назад, когда минус 1 месяц с форматированием

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

Я на Mac OSX java SE 8 1.8.0_45 также попытался java SE 8 1.8.0_72

Что я делаю неправильно?

Добавление более подробного объяснения здесь

Видимо часть моей проблемы связана с форматированием

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

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

дает тот же результат

ответ

1

ГГГГ - это годовая стоимость для дат стиля «год-неделя», как в 2006W52. Это может быть не в год по значению +1 или -1, если неделя, о которой идет речь, ограничивает границу года. Похоже, вы выбрали последнюю неделю года.

См http://en.wikipedia.org/wiki/ISO_8601#Week_dates

Смотри также: java.time.LocalDateTime (also ZonedDateTime). Fails to return one year backward when minus 1 month with formatting

3

Вы можете сделать что-то вроде этого:

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

, а затем

LocalDateTime d2 = d.minusMonth(1); 
return d2; 

из API Java 8 (LINK):

minusYears(long years) 

Возвращает копию этого LocalDateTime с указанным числом лет, вычитаемых.

и d.minusMonth

Возвращает копию этого LocalDateTime с указанным количеством месяцев вычитаются.

+0

См добавление выше –

+0

Мой код получает то, чтобы добавить или удалить из строки, так что это тот же самый код делает d.plus (1, ChronoUnit.YEARS)) или d.plus (-1, ChronoUnit.MONTHS)), что в любом случае не является проблемой здесь, поскольку d.plus (-1, ChronoUnit.MONTHS)) дает тот же результат, что и d.minusMonth (1) –

0

Поскольку вы хотите назад один месяц , то вы должны сделать это, например:

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

Фактически LocalDateTime d = LocalDateTime.of (2016, Month.JANUARY, 28, 0, 0, 0); System.out.println (d); System.out.println (d.plus (-1, ChronoUnit.MONTHS)) System.out.println (d.minusMonths (1)); Работает отлично. –

0

Я думаю, что вы ищете d.minusMonths (...). Я никогда не использовал метод «плюс».

1

Я нашел решение моей проблемы

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

выход

2015-12-28T00:00:00.000Z 

Так что я думаю, что-то не так с рисунком DateTimeFormatter.ofPattern("YYYY-MM-dd'T'HH:mm:ss.SSSX")

На самом деле это форматирование DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX") работы

Damn Это !!!!

Любой может объяснить, почему мои тесты проходили вчера, а не сегодня, что особенного о 28 января ??????

Смежные вопросы