Продолжая с вопроса переполнения стека Java-программа, чтобы получить текущую дату без отметки времени :
Каков наиболее эффективный способ получить объект Date без времени? Есть ли другой способ, кроме этих двух?
// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));
// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();
Обновление :
Я знал о Джода-Тайм ; Я просто пытаюсь избежать дополнительной библиотеки для такой простой (я думаю) задачи. Но, основываясь на ответах, пока Joda-Time кажется чрезвычайно популярным, поэтому я мог бы рассмотреть это.
Под эффективностью я подразумеваю, что хочу избежать
String
создания временных объектов в том видеmethod 1
, вmethod 2
каком они используются , а пока кажется взломом вместо решения.
Ответы:
Вы обязательно должны использовать
java.util.Date
? Я бы тщательно рекомендую вам использовать Joda время илиjava.time
пакет из Java 8 вместо. В частности, пока Дата и Календарь всегда представляют определенный момент времени, без такого понятия , как «только дата», Joda Время делает иметь тип , представляющий это (LocalDate
). Ваш код будет намного понятнее, если вы сможете использовать типы, которые представляют то, что вы на самом деле пытаетесь сделать.Существует множество причин использовать Joda Time или
java.time
вместо встроенныхjava.util
типов - обычно они гораздо лучше API. Вы всегда можете конвертировать в / из ajava.util.Date
на границах вашего собственного кода, если вам нужно, например, для взаимодействия с базой данных.источник
Date
объект - этот ответ форматирует дату в строку, что не одно и то же. По сути, спрашивать, на какой датеDate
находится a, - это бессмысленный вопрос без дополнительной информации: часовой пояс и система календаря, которую вы используете.Вот что я использовал, чтобы получить сегодняшнюю дату с установленным временем
00:00:00
:источник
Вы можете использовать DateUtils.truncate из библиотеки Apache Commons.
Пример:
источник
Да, есть.
java.time
Java 8 и более поздние версии поставляются с новым встроенным пакетом java.time . Смотрите учебник . Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
Подобно Joda-Time , java.time предлагает
LocalDate
класс для представления значения только для даты без времени суток и без часового пояса.Обратите внимание, что часовой пояс имеет решающее значение для определения конкретной даты. Например, в полночь в Париже дата все еще «вчера» в Монреале.
По умолчанию java.time использует стандарт ISO 8601 при создании строкового представления даты или значения даты-времени. (Еще одно сходство с Joda-Time.) Так что просто позвоните,
toString()
чтобы сгенерировать текст, как2015-05-21
.О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
TimeZone.setDefault
во время выполнения и немедленно влиять на весь другой код, выполняемый в этой JVM. Мораль истории: всегда указывайте часовой пояс.Самый простой способ:
источник
long dateOnly = (currentTime / millisInDay) * millisInDay;
такая же, как записьlong dateOnly = currentTime;
?Стандартный ответ на эти вопросы - использовать Joda Time . API лучше, и если вы используете средства форматирования и анализаторы, вы можете избежать неинтуитивного отсутствия безопасности потоков
SimpleDateFormat
.Использование Joda означает, что вы можете просто сделать:
Update :: Использование Java 8 это может быть достигнуто с помощью
источник
LocalDate
класс, аналогичный Joda-Time.DateTimeZone
этот конструктор LocalDate. Определение текущей даты зависит от часового пояса, так как Париж начинает новую дату раньше, чем Монреаль. Если вы опустите часовой пояс, часовой пояс вашего JVM будет применяться по умолчанию. Обычно лучше указать, чем полагаться на значение по умолчанию.Это простой способ сделать это:
источник
Не имеет смысла говорить о дате без метки времени в отношении процедур Date в стандартной среде выполнения Java, поскольку она, по сути, отображается на определенную миллисекунду, а не на дату. К указанной миллисекунде присуще время суток, что делает ее уязвимой для проблем с часовым поясом, таких как переход на летнее время и другие настройки календаря. См. Почему вычитание этих двух раз (в 1927 году) дает странный результат? за интересный пример.
Если вы хотите работать с датами, а не с миллисекундами, вам нужно использовать что-то еще. Для Java 8 есть новый набор методов, обеспечивающих именно то, что вы просите. Для Java 7 и более ранних версий используйте http://www.joda.org/joda-time/
источник
Определенно, это не самый правильный путь, но если вам просто нужно быстрое решение, чтобы получить дату без времени, и вы не хотите использовать стороннюю библиотеку, это должно сделать
Мне нужно было только свидание для наглядных целей, и я не смог, поэтому я подстригся.
источник
источник
Ну, насколько я знаю, нет более простого способа добиться этого, если вы используете только стандартный JDK.
Конечно, вы можете поместить эту логику в method2 в статическую функцию в вспомогательном классе, как это сделано в методе toBeginningOfTheDay.
Затем вы можете сократить второй метод до:
Или, если вам действительно нужен текущий день в этом формате так часто, то вы можете просто обернуть его другим статическим вспомогательным методом, тем самым сделав его однострочным.
источник
Если все, что вам нужно, это увидеть дату «YYYY-MM-DD» без всякого другого беспорядка, например, «Чт 21 мая 12:08:18 EDT 2015», тогда просто используйте
java.sql.Date
. Этот пример получает текущую дату:Также
java.sql.Date
является подклассомjava.util.Date
.источник
Если вам просто нужна текущая дата, без времени, другой вариант:
источник
00:00:00
обычно бывает (может варьироваться в зависимости от часового пояса для таких аномалий, как DST ). Итак, как отмечают другие Ответы,LocalDate
класс более уместен из Joda-Time (при условии, что вы ссылаетесь на Joda-Time - что вы должны явно указать при цитировании классов, не связанных с Java).Используйте
LocalDate.now()
и конвертируйтеDate
как ниже:источник
TimeZone.setDefault
. Ваш код вызываетZoneId.systemDefault
дважды, первый неявный в,LocalDate.now()
а второй явный сatStartOfDay
. Между этими двумя моментами во время выполнения текущая зона по умолчанию может измениться. Я предлагаю записать зону в переменную и перейти к обоим методам.Если вам нужна часть даты только для повторения цели, то
источник
Как насчет этого?
источник
Проверьте Вейдер-время . Это простая и эффективная альтернатива java.util и Joda-time. Он имеет интуитивно понятный API и классы, которые представляют даты самостоятельно, без отметок времени.
источник
Самый верный способ, который в полной мере использует огромную базу данных TimeZone Java и является правильным:
источник
Вот чистое решение без преобразования в строку и обратно, а также оно не пересчитывает время несколько раз, когда вы сбрасываете каждый компонент времени в ноль. Он также использует
%
(модуль), а не делить с последующим умножением, чтобы избежать двойной операции.Он не требует никаких сторонних зависимостей и УЗНАЕТ ВРЕМЯ ЗОНЫ переданного объекта Calender. Эта функция возвращает момент времени в 12:00 в часовом поясе даты (Календарь), в которую вы передаете.
источник
Предпочитаю не использовать сторонние библиотеки в максимально возможной степени. Я знаю, что этот способ упоминался ранее, но вот хороший чистый способ:
Ну, возможно, не использовать GregorianCalendar!
источник
Я только что сделал это для моего приложения:
Android API уровня 1, без внешней библиотеки. Он учитывает дневной свет и часовой пояс по умолчанию. Никаких манипуляций со строками, так что я думаю, что этот способ более эффективен, чем ваш, но я не проводил никаких тестов.
источник
Йо может использовать время йода.
и вы звоните с:
источник