Какой самый эффективный способ вырезать время из объекта Java Date? - PullRequest
4 голосов
/ 25 августа 2010

Какой самый эффективный способ удалить часть времени из объекта даты Java с использованием только классов из JDK?

У меня есть следующее

myObject.getDate ()= {java.util.Date} "Ср 26 мая 23:59:00 BST 2010»

Чтобы вернуть время обратно к 00:00:00, я делаю следующее

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date myDate = sdf.parse(sdf.format(myObject.getDate()));

Вывод теперь

myDate = {java.util.Date} "Ср 26 мая 00:00:00 BST 2010"

IsЕсть ли лучший способ достичь того же результата?

Ответы [ 5 ]

10 голосов
/ 25 августа 2010

Более подробный, но, возможно, более эффективный:

    Calendar cal = GregorianCalendar.getInstance();
    cal.setTime(date);
    // cal.set(Calendar.HOUR, 0);   // As jarnbjo pointed out this isn't enough
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

Кроме того, вам не нужно беспокоиться о настройках локали, которые могут вызвать проблемы с преобразованием строки в дату.

7 голосов
/ 25 августа 2010

Если у вас есть общие Apache, вы можете использовать DateUtils.truncate () :

Date myDate = DateUtils.truncate(myObject.getDate(), Calendar.DATE)

(Если у вас нет доступа к Apache Commons, DateUtils.truncate () реализуется в основном так же, как ответ kgiannakakis .)


Теперь, если вам нужен «умный» код, который очень быстр, и вы не возражаете против использования устаревших функций из java.util.Date, вот другое решение. (Отказ от ответственности: я бы не использовал этот код сам. Но я проверил его, и он работает, даже в дни, когда DST начинается / заканчивается.)

long ts = myObject.getDate().getTime() - myObject.getDate().getTimezoneOffset()*60000L;
Date myDate = new Date(ts - ts % (3600000L*24L));
myDate.setTime(myDate.getTime() + myDate.getTimezoneOffset()*60000L);
1 голос
/ 25 августа 2010

Эти методы устарели, но, получив Date, вы можете сделать что-то вроде этого:

Date d = ...;
d.setHours(0);
d.setMinutes(0);
d.setSeconds(0);

Вы должны использовать Calendar, если это возможно. Затем вы бы использовали cal.set(Calendar.MINUTE, 0) и т. Д.

Следует отметить, что если это вообще вариант, вы должны использовать Joda-Time .

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

0 голосов
/ 25 августа 2010
myDate.setTime(myDate.getTime()-myDate.getTime()%86400000)

может помочь.Поговорим о быстрой и грязной.

0 голосов
/ 25 августа 2010

Вы принимаете во внимание часовой пояс?Я вижу, у вас есть BST прямо сейчас, но что, когда BST закончится?Вы все еще хотите использовать BST?

В любом случае, я бы посоветовал вам взглянуть на DateMidnight из JodaTime и использовать его.1009 * Все может варьироваться в зависимости от того, как вы хотите обрабатывать часовые пояса.Но в простейшей форме это должно быть так просто:

DateMidnight d = new DateMidnight(myObject.getDate());

Если вы должны конвертировать обратно, перейдите java.util.Date:

Date myDate = d.toDate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...