java.util.Date: семь дней назад

Это вызвано функцией «smartindent». Если у вас есть :set smartindent в вашем .vimrc, вам нужно удалить его.

23
задан Ramy 4 February 2011 в 20:43
поделиться

11 ответов

Именно с этого момента:

long DAY_IN_MS = 1000 * 60 * 60 * 24;
new Date(System.currentTimeMillis() - (7 * DAY_IN_MS))

Из произвольного Date date:

new Date(date.getTime() - (7 * DAY_IN_MS))

Редактировать: Как указано в других ответах, переход на летнее время не учитывается время, если это фактор.

Просто чтобы прояснить это ограничение, о котором я говорил:

Для людей, пострадавших от перехода на летнее время , если под 7 days earlier, вы имеете в виду, что если это правильно теперь это 12pm noon on 14 Mar 2010, вы хотите, чтобы вычисление 7 days earlier привело к 12pm on 7 Mar 2010, тогда будьте осторожны.

Это решение находит дату / время ровно 24 часа * 7 дней = 168 часов раньше.

Однако, некоторые люди удивляются , когда это решение обнаруживает, что, например, (14 Mar 2010 1:00pm) - 7 * DAY_IN_MS может возвращать результат в (7 Mar 2010 12:00pm), где время настенных часов в вашем часовом поясе не совпадает между 2 датой / временем (1pm и 12pm). Это происходит из-за перехода на летнее время, которое начинается или заканчивается той ночью, и из-за того, что «настенные часы» теряют или набирают час.

Если летнее время не является для вас фактором или если вы действительно хотите (168 hours) точно (независимо от смещения времени настенных часов), то это решение работает отлично.

В противном случае вам может потребоваться компенсация, если ваш 7 days earlier на самом деле не означает ровно 168 часов (из-за начала или окончания летнего времени в течение этого периода).

51
ответ дан Bert F 4 February 2011 в 20:43
поделиться

Используйте функцию календаря для создания новых объектов Date, используя getTime():

import java.util.GregorianCalendar;
import java.util.Date;

Calendar cal = new GregorianCalendar();
cal.add(Calendar.DAY_OF_MONTH, -7);
Date sevenDaysAgo = cal.getTime();
27
ответ дан Venkat Sudheer Reddy Aedama 4 February 2011 в 20:43
поделиться

попробуйте

 Date sevenDay = new Date(System.currentTimeMillis() - 7L * 24 * 3600 * 1000));

Другой способ - использовать Календарь, но мне самому не нравится.

13
ответ дан Peter Lawrey 4 February 2011 в 20:43
поделиться

Поскольку еще никто не упомянул TimeUnit:

new Date(System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7))
9
ответ дан Daniel 4 February 2011 в 20:43
поделиться

Попробуйте это:

Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -7);
return c.getTime();
5
ответ дан Jeffrey Hantin 4 February 2011 в 20:43
поделиться

Я не уверен, когда они добавили их, но JasperReports имеет свой собственный набор «функций», которые могут манипулировать датами. Вот пример, который я не проверял полностью:

DATE(YEAR(TODAY()), MONTH(TODAY()), DAY(TODAY()) - 7)

, который строит java.util.Date с датой, установленной на 7 дней с сегодняшнего дня. Если вы хотите использовать другую «якорную» дату, просто замените TODAY() на любую дату, которую вы хотите использовать.

2
ответ дан Christopher Schultz 4 February 2011 в 20:43
поделиться

Для определения «дней» требуется часовой пояс. Часовой пояс определяет, когда начинается «день». Часовой пояс включает в себя правила для перехода на летнее время и другие аномалии. Там нет магии, чтобы сделать часовые пояса неактуальными. Если вы игнорируете проблему, будет применен часовой пояс JVM по умолчанию. Это приводит к растерянности и боли.

Избегайте java.util.Date

Классы java.util.Date и .Calendar, как известно, доставляют много хлопот. Избежать их. Они настолько плохи, что Sun / Oracle согласились заменить их новым пакетом java.time в Java 8. Используйте либо этот, либо Joda-Time .

Joda-Time

Пример кода в Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" ); // Specify or else the JVM's default will apply.
DateTime dateTime = new DateTime( new java.util.Date(), timeZone ); // Simulate passing a Date.
DateTime weekAgo = dateTime.minusDays( 7 );

Первый момент дня

Или, возможно, вы захотите настроить время дня на первый момент дня, чтобы зафиксировать ценность всего дня. Вызовите метод withTimeAtStartOfDay. Имейте в виду, что это обычно 00:00:00, но не всегда.

Избегайте «полуночных» методов и классов в Joda-Time. Они основаны на ошибочной концепции и в настоящее время устарели.

DateTime dateTimeStart = new DateTime( new java.util.Date(), timeZone ).withTimeAtStartOfDay(); // Not necessarily the time "00:00:00".
DateTime weekAgo = dateTime.minusDays( 7 ).withTimeAtStartOfDay(); 

Преобразование в / из j.u.Date

Как показано выше, для преобразования из java.util.Date в Joda-Time просто передайте объект Date в конструктор DateTime. Поймите, что у j.u.Date нет часового пояса , а у DateTime. Поэтому назначьте желаемый / подходящий часовой пояс, чтобы решить, какие «дни» и когда они начнутся.

Чтобы пойти другим путем, от DateTime к j.u.Date, просто вызовите метод toDate.

java.util.Date date = dateTime.toDate();
1
ответ дан Basil Bourque 4 February 2011 в 20:43
поделиться

Из-за жаркой дискуссии:

Вопрос может не иметь правильного ответа без обозначенного часового пояса.

ниже приведен код для работы с часовым поясом по умолчанию (и, следовательно, устаревшим), который учитывает переход на летнее время в часовом поясе по умолчанию.

Date date= new Date();
date.setDate(date.getDate()-7);//date works as calendar w/ negatives

Несмотря на то, что решение работает, оно точно такое же поддельное, как и с точки зрения предположения о часовом поясе.

new Date(System.currentTimeMillis() - 10080*60000);//a week has 10080 minutes

Пожалуйста, не голосуйте за ответ.

0
ответ дан bestsss 4 February 2011 в 20:43
поделиться

Есть ли причина, по которой вы не можете сделать расчет в своем бине? Затем отправьте его в свой отчет в качестве параметра.

0
ответ дан Blauharley 4 February 2011 в 20:43
поделиться

Я делаю это так:

Date oneWeekAgo = DateUtils.addDays(DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH), -7);
0
ответ дан Ellone 4 February 2011 в 20:43
поделиться

Вы можете попробовать это,

    Calendar c = Calendar.getInstance();
    c.add(Calendar.DAY_OF_MONTH, -7);
    System.out.println(new java.sql.Date(c.getTimeInMillis()));
0
ответ дан emon 4 February 2011 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: