2016-07-22 3 views
0

Я получаю дату начала как «2016-06-01» и дату окончания как «2016-07 -01 "(в строчном формате) для поиска записей в MongoDB. Нужно указать указатель/руководство для добавления времени начала (00: 00: 00.000) к дате начала и максимальному времени (23.59.59.999) до даты окончания, как указано ниже в Java, с использованием java.util.Date или любых других, которые поддерживаются MongoDB.Java - время начала/добавления времени начала (00: 00: 00.000) и время окончания (23.59.59.999) на сегодняшний день

Example : 
Start Date+with time : 2016-06-01T00:00:00.000 
End Date+with time : 2016-07-01T23:59:59.999 

ответ

0

общественного класса DateSample {

public static void main(String[] args) throws ParseException { 

    String startDate = "2016-06-01"; 
    String endDate = "2016-07-01"; 

    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    Date strDate = formatter.parse(startDate+" 00:00:00.000"); 
    Date enDate = formatter.parse(endDate+" 23:59:59.999"); 
    System.out.println(formatter.format(strDate)); 
    System.out.println(formatter.format(enDate)); 

} 

}

Вы получите 2016-06-01 00:00:00 2016-07-01 23:59:59

+0

Получение и начало и конец даты как же - Начало: Чт 01 января 00:00:00 IST 1970 и Конец: Чт янв 01 00:00:00 IST 1970 – Paddy

+0

Я обновил ответ, попробовал это – Developer

0

Для этого вы можете использовать DateTimeFormatter.ISO_LOCAL_DATE_TIME. Вот пример, который может пролить свет на то, что вы пытаетесь сделать:

DateTimeFormatter dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME; 
String startTime = "T00:00:00.000"; 
String endTime = "T23:59:59.999"; 
//here I used the LocalDateTime parser to parse the data+startTime/endTime 
LocalDateTime startLocalDateTime = LocalDateTime.parse("2016-07-01"+startTime); 
LocalDateTime endLocalDateTime = LocalDateTime.parse("2016-07-01"+endTime); 
//with the LocalDateTime, you can then to whatever you want 
//as an example, I am parsing it using ISO_LOCAL_DATE_TIME : 
String strinStartTime= dtf.format(LocalDateTime.parse("2016-07-22"+startTime)); 

Надеюсь, это поможет;

0

Если вы работаете под JDK 1.8, используйте LocalDateTime

LocalDateTime представляет собой встроенный апи из JDK 1.8. Вы можете найти объяснение здесь docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html. Вы можете использовать минус * или плюс * и синтаксический Методы

+0

Нехороший ответ для переполнения стека. Оба вопроса и ответы должны быть * конкретными *, ориентированными на лазерах на решение. Смутно указывая на библиотеку, как правило, недостаточно. –

+0

Хорошо. Извините за этот плохой ответ. LocalDateTime - встроенный api jre 1.8. Вы можете найти объяснение здесь https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html. Вы можете использовать минус * или плюс *, а также методы анализа. –

+0

Вы должны поместить этот контент в свой вопрос через ссылку «изменить» или кнопку. В противном случае вы можете удалить свой ответ, чтобы избежать пустых голосов. Повторите попытку, когда у вас есть время для полного ответа. –

0

ТЛ; др

ZoneId zoneId = ZoneId.of("Europe/Paris") ; 
LocalDate startDate = LocalDate.of("2016-06-01") ; 
ZonedDateTime zdt start = startDate.atStartOfDay(zoneId) ; 
ZonedDateTime zdt stop = startDate.plusMonths(1).atStartOfDay(zoneId) ; 
// Perform database search where ((x >= start) AND (x < stop)) . Notice '>=' versus '<' with no 'equals' on the latter. 

Если вам нужны струны ...

String outputStart = start.toInstant().toString() ; // 2016-05-31T22:00:00Z Paris in the summer is two hours ahead of UTC. 
String outputStop = stop.toInstant().toString() ; // 2016-06-30T22:00:00Z 

Подробности

Answer by ishmaelMakitla хороша тем, что она указывает на использование классов java.time, встроенных в Java 8 и более поздних версий. Но он фокусируется на строках, а не на объектах. Также он не обсуждает ключевую проблему часового пояса.

Классы java.time включают в себя:

  • LocalDate для даты только значения с не время-дня и без часового пояса.
  • LocalTime для значения времени суток без даты и без часового пояса.

    LocalDate startDate = LocalDate.parse ("2016-06-01"); // Анализ стандартного формата даты ISO 8601. LocalTime startTime = LocalTime.MIN; // '00: 00 '.

Оба этих классов могут быть использованы в фабричных методов для создания экземпляра LocalDateTime и другие классы.

LocalDateTime ldt = LocalDateTime.of(startDate , startTime); 

В коде выше мы использовали LocalTime.MIN получить 00:00. Чтобы напрямую ответить на ваш вопрос, вы также можете использовать LocalTime.MAX таким же образом, чтобы получить 23:59:59.999999999. Но я делаю не. Читайте ниже о «Half-Open».

часового пояса

Временная зона имеет решающее значение при определении даты и времени. В любой момент времени и часовом поясе изменяются по часовому поясу. Через несколько минут после полуночи в Париже новый день, пока еще «вчера» в Монреале.

Категории Local…: не действительные моменты на шкале времени. Они представляют собой смутное представление о возможно моменты. Как отмечалось выше, первый момент 1 июня в Париже - 31 мая в 18.00 в Монреале. Поэтому перед выполнением поиска в базе данных вам необходимо назначить часовой пояс для вашего LocalDateTime. Применение ZoneId создает объект ZonedDateTime.

Возможно, ваше времяпрепровождение предназначалось для Парижа.

ZoneId zoneId = ZoneId.of("Europe/Paris"); 
ZonedDateTime zdt = ldt.atZone(zoneId); 

Возможно, вы имели в виду UTC. Все это зависит от ваших бизнес-правил, контекста, в котором работает ваше приложение. Для UTC мы используем OffsetDateTime, так как UTC - это не полный часовой пояс, а просто offset-from-UTC. Часовой пояс - это смещение плюс набор правил для обработки аномалий, таких как летнее время (DST).

OffsetDateTime odt = ldt.atOffset(ZoneOffset.UTC); 

Чтобы получить строку, как просили в вопросе, извлечь LocalDate и вызвать toString(). Но я не рекомендую это, поскольку он игнорирует часовой пояс (см. Ниже).

String output = odt.toLocalDateTime.toString(); // Not likely to be what you really need. 

Лучшая практика в базах данных заключается в том, чтобы хранить дату и время в UTC. Я не знаю о MongoDB. Обязательно прочитайте документ о том, как ваш драйвер базы данных в Java может влиять на/переводить указанные вами значения.

Начало дня

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

В некоторых ситуациях классы java.time будут вносить необходимые корректировки. Обязательно прочтите документ класса, чтобы убедиться, что поведение соответствует вашим ожиданиям. &.

Вы можете запросить java.time, чтобы найти время начала.

ZonedDateTime zdt = LocalDate.of("2016-06-01").atStartOfDay(zoneId); 

Half-Open

Ваша попытка определить конец дня является проблемой. Эта последняя секунда бесконечно делима. Традиционные Unix-ориентированные библиотеки разрешают целые секунды, старые классы времени в Java разрешают миллисекунды, некоторые базы данных, такие как Postgres, могут разрешаться на микросекундах, а java.time и другие базы данных, такие как H2, разрешаются наносекундами. Не вставайте посреди этого.

Как правило, в программировании продолжительности времени в режиме времени наилучшая практика - «Полуоткрытая». Начало пролета включительно в то время как окончание исключая.

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

ZoneId zoneId = ZoneId.of("Europe/Paris"); 
LocalDate startDate = LocalDate.of("2016-06-01"); 
ZonedDateTime zdt start = startDate.atStartOfDay(zoneId); 
ZonedDateTime zdt stop = startDate.plusMonths(1).atStartOfDay(zoneId); 
// Perform database search where ((x >= start) AND (x < stop)) . Notice '>=' versus '<' with no 'equals' on the latter. 

Аналогичным образом, месяц записей для UTC, а не Париж.

ZoneOffset zoneOffset = ZoneOffset.UTC; 
LocalDate startDate = LocalDate.of("2016-06-01"); 
OffsetDateTime start = OffsetDateTime.of(startDate , zoneOffset); 
OffsetDateTime stop = OffsetDateTime.plusMonths(1).of(startDate , zoneOffset); 
// Perform database search where ((x >= start) AND (x < stop)) . Notice '>=' versus '<' with no 'equals' on the latter. 

Использование полуоткрытого подхода последовательно на протяжении всего приложения, где обработки протяжения времени сделает ваш код более разумным и легче понять. Вы также можете обучить своих пользователей думать так. Мы все используем Half-Open интуитивно в ситуациях, таких как «Перерыв на обед с 12:00 до 13:00». Мы все знаем, что это означает вернуться с обеда до часы забастовки 13:00:00.0.