У меня есть объект Java Date, содержащий информацию о дате и времени. Я хочу написать метод, который отсекает информацию о времени, обрезает часы-минуты-секунды, чтобы у меня оставалась только дата.
Пример ввода:
2008-01-01 13:15:00
Ожидаемый результат:
2008-01-01 00:00:00
У тебя есть чаевые? Я пробовал сделать что-то вроде этого:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
но у меня возникли проблемы с часовым поясом.
java.util.Calendar
теперь унаследованные , заменены классами java.time . См. Учебник Oracle .Вы смотрели на метод усечения DateUtils в Apache Commons Lang?
удалит элемент времени.
источник
Вы смотрели на Джоду ? Это гораздо более простой и интуитивно понятный способ работы с датой и временем. Например, вы можете легко конвертировать между (скажем) объектами LocalDateTime и LocalDate .
например (для иллюстрации API)
Кроме того, он решает некоторые проблемы, связанные с безопасностью потоков при использовании форматеров даты / времени, и его настоятельно рекомендуется использовать для работы с любыми проблемами даты / времени в Java.
источник
Просто быстрое обновление в свете классов java.time, теперь встроенных в Java 8 и новее.
LocalDateTime
естьtruncatedTo
метод, который эффективно обращается к тому, о чем вы здесь говорите:Это выразит текущее время с точностью до минут:
Вы можете использовать
ChronoUnit
(илиTemporalUnit
) меньше ДНЕЙ для выполнения усечения (поскольку усечение применяется только к временной части LocalDateTime, а не к части даты).источник
источник
С Joda вы легко можете получить ожидаемое свидание.
Начиная с версии 2.7 (возможно, с тех пор, как какая-то предыдущая версия выше, чем 2.2), как отмечает комментатор,
toDateMidnight
устарела в пользу или удачно названаwithTimeAtStartOfDay()
, что делает удобныйвозможно.
Добавлена выгода в виде более приятного API.
Со старыми версиями вы можете сделать
источник
withTimeAtStartOfDay
.toLocalDate
для получения объекта, у которого даже нет компонента времени.Я сделал усечение с новым API java8. Столкнулся с одной странной вещью но в целом обрез ...
источник
Используйте DateUtils из Apache с усечением, например:
источник
Для отметок времени:
источник
Из java.util.Date JavaDocs:
и из java.sql.Date JavaDocs:
Итак, лучший подход - использовать java.sql.Date, если вам не нужна временная часть.
и вывод:
источник
ТЛ; др
Чтобы сгенерировать строку в желаемом формате, передайте
DateTimeFormatter
.подробности
Другие ответы верны, но используйте старые классы даты и времени, которые теперь устарели фреймворком java.time.
java.time
Фреймворк java.time встроен в Java 8 и новее. Большая часть функциональности java.time перенесена на Java 6 и 7 ( ThreeTen-Backport ) и дополнительно адаптирована для Android ( ThreeTenABP ).
Сначала измените входную строку, чтобы она соответствовала канонической версии формата ISO 8601. Стандартные форматы ISO 8601 используются по умолчанию в классах java.time для синтаксического анализа / генерации строк, представляющих значения даты и времени. Нам нужно заменить это ПРОБЕЛ посередине на
T
.Теперь мы можем разобрать его как a
LocalDateTime
, где «Local» означает отсутствие конкретной местности. На входе отсутствует информация о смещении от UTC или часовом поясе.Если вам не важны ни время суток, ни часовой пояс, конвертируйте в формат
LocalDate
.Первый момент дня
Если вместо этого вы хотите установить время дня на первый момент дня, используйте
ZonedDateTime
класс, а затем преобразуйте его вLocalDate
объект для вызова егоatStartOfDay
метода. Имейте в виду, что первым моментом может быть не время00:00:00
из-за летнего времени или, возможно, других аномалий.Часовой пояс имеет решающее значение, потому что в любой момент дата меняется в зависимости от зоны в мире. Например, несколько мгновений после полуночи в Париже - это новый день для парижан, но для канадцев это все еще «вчерашний день» в Монреале.
универсальное глобальное время
Чтобы увидеть этот момент сквозь призму часового пояса UTC , извлеките
Instant
объект. Оба символаZonedDateTime
иInstant
будут представлять один и тот же момент на шкале времени, но будут отображаться как два разных времени настенных часов .An
Instant
- это базовый класс строительных блоков в java.time, всегда по определению в формате UTC. Используйте этот класс часто, поскольку, как правило, вы должны выполнять свою бизнес-логику, хранение данных и обмен данными в формате UTC.Мы видим 5 утра, а не полночь. В стандартном формате,
Z
конец является сокращениемZulu
и означает «UTC».О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в
java.sql.*
занятиях.Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
Используйте Календарь класс,
set()
метод , чтобы установитьHOUR_OF_DAY, MINUTE, SECOND
иMILLISECOND
поле к нулю.источник
Вопрос противоречивый. Он запрашивает дату без времени суток, но отображает пример со временем
00:00:00
.Joda времени
UPDATE: Joda время проект сейчас находится в режиме технического обслуживания , с командой советуя миграции в java.time классы. См. Мой другой ответ для решения java.time.
Если вместо этого вы хотите установить время дня на первый момент дня, используйте
DateTime
объект в библиотеке Joda-Time и вызовите егоwithTimeAtStartOfDay
метод. Имейте в виду, что первым моментом может быть не время00:00:00
из-за летнего времени или, возможно, других аномалий.источник
Просто
clear()
лишние поля.Из Java 8 лучшим вариантом является использование
truncatedTo
методаLocalDateTime
, например:источник
calendar.clear(Calendar.HOUR_OF_DAY);
что не очищаются часы. Решение от @cletus работает нормально.Меня действительно раздражало, что новый «улучшенный» конструктор календаря не принимает int для миллисекунд, как «ужасный» старый конструктор Date. Я тогда очень рассердился и написал это:
В то время я не использовал слово «материал», но потом я обнаружил, что такое счастье:
Но я все еще очень зол на это.
источник
Я исправил такую проблему (в зоне Восточной восьмерки (по пекинскому времени)):
Прежде всего, вы должны четко понимать, что такое метка времени. Отметка времени - это общее количество миллисекунд с 01 января 00:00:00 1970 по Гринвичу (то же самое, что и UTC) или четверг 01 января с 08:00:00 CST 1970 по настоящее время.
Помните: отметка времени не зависит от часового пояса.
Таким образом, вы получите тот же результат с помощью следующего оператора в разных часовых поясах:
И
печатает разную информацию о времени в разных часовых поясах: если вы установите часовой пояс компьютера как UTC, вы получите
Но если вы установите часовой пояс как (UTC +8: 00) Пекин, Чунцин, Гонконг, Урумк, вы получите:
Java получает отметку времени, а затем отображает информацию о дате и времени в соответствии с часовым поясом.
Для введения того, как Java отображает информацию о дате и времени в разных часовых поясах, легко понять, как транслировать информацию о времени. Вы должны получить отметку времени и принять во внимание часовой пояс при отключении информации о времени. Затем вы можете создать новый объект Date с вырезанной отметкой времени (мы можем назвать это отметкой даты), java компенсирует часовой пояс при отображении информации о дате.
Как и в зоне Восточной восьмерки (по пекинскому времени), пекинское время на 8 часов раньше, чем по Гринвичу, поэтому вам следует вычесть больше 8 часов при выполнении операции по модулю. То есть сначала вы должны получить время по Гринвичу, затем Java добавит 8 часов при отображении времени на основе настройки часового пояса вашего компьютера.
Вопрос о часовом поясе неясен и долгое время меня озадачивает. Теперь я проясняю. Надежда помогает.
2018-01-04 Метод ниже также работает.
}
источник
Вы можете сделать это, чтобы избежать проблем с часовым поясом:
Хотя
Date
объект Java является значением метки времени, но во время усечения он будет преобразован в местный часовой пояс, поэтому вы получите удивительное значение, если ожидаете значение из часового пояса UTC.источник
Calendar
иDate
классы стали унаследованными много лет назад с классами java.time, реализующими JSR 310 в Java 8 и более поздних версиях. Предлагать их использование в 2018 году - плохой совет.Возможно, ответ запоздал, но вот способ сделать это одной строкой без использования каких-либо библиотек:
источник
С Joda-Time, начиная с версии 2.0, вы можете использовать
LocalDate.toDate()
.Просто
источник
a Java Date object
таким, что я использовалjava.util.Date
. Более того, он не объясняет, почему его часовой пояс проблематичен с java.util.Date (когда? Где?), Хотя он не может помочь, используя что-то, кромеDate
.Для всех ответов, использующих Календарь, вы должны использовать его следующим образом
Но я предпочитаю это:
источник
java.sql.Date
Класс притворяется , чтобы представлять дату только значение , но на самом деле действительно есть время-день с поправкой на часовой пояс UTC. Так что не совсем подходящее решение вопроса.Вот простой способ получить дату без времени, если вы используете Java 8+: используйте тип java.time.LocalDate вместо Date.
Выход:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
источник
LocalDate
- хорошая идея для большинства целей, но неясно, как это будет работать с вводными данными из вопроса2008-01-01 13:15:00
.