Как я могу получить дату без времени в Java? - PullRequest
215 голосов
/ 19 февраля 2011

Продолжение вопроса о переполнении стека 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();

Обновление :

  1. Я знал о Joda-Time ;Я просто пытаюсь избежать дополнительной библиотеки для такой простой (я думаю) задачи.Но, основываясь на ответах, пока Joda-Time кажется чрезвычайно популярным, поэтому я мог бы рассмотреть его.

  2. По по эффективности , я имею в виду, я хочу избежать временного объекта String создание, используемое method 1, в то время как method 2 похоже на взлом вместо решения.

Ответы [ 22 ]

3 голосов
/ 23 августа 2016

Если вам просто нужна текущая дата, без времени, другой вариант:

DateTime.now().withTimeAtStartOfDay()
3 голосов
/ 28 сентября 2015
// 09/28/2015
System.out.println(new SimpleDateFormat("MM/dd/yyyy").format(Calendar.getInstance().getTime()));

// Mon Sep 28
System.out.println( new Date().toString().substring(0, 10) );

// 2015-09-28
System.out.println(new java.sql.Date(System.currentTimeMillis()));

// 2015-09-28
// java 8
System.out.println( LocalDate.now(ZoneId.of("Europe/Paris")) ); // rest zones id in ZoneId class
3 голосов
/ 19 февраля 2011

Ну, насколько я знаю, нет более простого способа добиться этого, если вы используете только стандартный JDK.

Конечно, вы можете поместить эту логику в method2 в статическую функцию в помощнике.класс, как сделано здесь в методе toBeginningOfTheDay

Затем вы можете сократить второй метод до:

Calendar cal = Calendar.getInstance();
Calendars.toBeginningOfTheDay(cal);
dateWithoutTime = cal.getTime();

Или, если вам действительно нужен текущий день вэтот формат так часто, что вы можете просто обернуть его другим статическим вспомогательным методом, сделав его однострочным.

3 голосов
/ 21 мая 2015

Если все, что вам нужно, это видеть дату, например, «ГГГГ-ММ-ДД» без всего прочего, например «Чт 21 мая 12:08:18 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2015», тогда просто используйте java.sql.Date.Этот пример получает текущую дату:

new java.sql.Date(System.currentTimeMillis());

Также java.sql.Date является подклассом java.util.Date.

2 голосов
/ 05 октября 2012

Если вам нужна часть даты только для повторения, тогда

Date d = new Date(); 
String dateWithoutTime = d.toString().substring(0, 10);
1 голос
/ 12 июля 2018

Как насчет этого?

public static Date formatStrictDate(int year, int month, int dayOfMonth) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(year, month, dayOfMonth, 0, 0, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTime();
}
1 голос
/ 13 сентября 2016

Это чистое решение без преобразования в строку и обратно, а также оно не пересчитывает время несколько раз, когда вы сбрасываете каждый компонент времени на ноль.Он также использует % (модуль) вместо деления с последующим умножением, чтобы избежать двойной операции.

Он не требует никаких сторонних зависимостей и ОТВЕТИТ НА ПЕРЕДАЧУ ВРЕМЕННОГО ЗОНА объекта Calender. Эта функция возвращаетмомент времени в 12 часов утра в часовом поясе даты (Календарь), в котором вы проходите.

public static Calendar date_only(Calendar datetime) {
    final long LENGTH_OF_DAY = 24*60*60*1000;
    long millis = datetime.getTimeInMillis();
    long offset = datetime.getTimeZone().getOffset(millis);
    millis = millis - ((millis + offset) % LENGTH_OF_DAY);
    datetime.setTimeInMillis(millis);
    return datetime;
}
1 голос
/ 18 сентября 2015

Самый простой способ, который в полной мере использует огромную базу данных TimeZone Java и является правильным:

long currentTime = new Date().getTime();
long dateOnly = currentTime + TimeZone.getDefault().getOffset(currentTime);
1 голос
/ 01 октября 2011

Выезд Вейдер-тайм . Это простая и эффективная альтернатива java.util и Joda-time. Он имеет интуитивно понятный API и классы, которые представляют даты самостоятельно, без отметок времени.

0 голосов
/ 17 августа 2018

Я только что сделал это для своего приложения:

public static Date getDatePart(Date dateTime) {
    TimeZone tz = TimeZone.getDefault();
    long rawOffset=tz.getRawOffset();
    long dst=(tz.inDaylightTime(dateTime)?tz.getDSTSavings():0);
    long dt=dateTime.getTime()+rawOffset+dst; // add offseet and dst to dateTime
    long modDt=dt % (60*60*24*1000) ;

    return new Date( dt
                    - modDt // substract the rest of the division by a day in milliseconds
                    - rawOffset // substract the time offset (Paris = GMT +1h for example)
                    - dst // If dayLight, substract hours (Paris = +1h in dayLight)
    );
}

Android API уровня 1, без внешней библиотеки. Он учитывает дневной свет и часовой пояс по умолчанию. Никаких манипуляций со строками, поэтому я думаю, что этот способ более эффективен, чем ваш, но я не проводил никаких тестов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...