2013-10-01 1 views
3

Мне нужно написать функцию, которая принимает java.util.Date и удаляет часы, минуты и миллисекунды из нее ИСПОЛЬЗОВАНИЕ JUST MATH (нет форматов даты, нет объектов Calendar и т. Д. .):Как удалить Hour, Minute и Second из временной отметки Epoch

private Date getJustDateFrom(Date d) { 
    //remove hours, minutes, and seconds, then return the date 
} 

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

Вот что я до сих пор:

private Date getJustDateFrom(Date d) { 
    long milliseconds = d.getTime(); 
    return new Date(milliseconds - (milliseconds%(1000*60*60))); 
} 

Проблема заключается в том, это только удаляет минуты и секунды. Я не знаю, как удалить часы.

Если я делаю milliseconds - (milliseconds%(1000*60*60*23)), он возвращается в 23:00 часов предыдущего дня.

EDIT:

Вот альтернативное решение:

public static Date getJustDateFrom(Date d) { 
    Calendar c = Calendar.getInstance(); 
    c.setTime(d); 
    c.set(Calendar.HOUR_OF_DAY, 0); 
    c.set(Calendar.MINUTE, 0); 
    return c.getTime(); 
} 

Будет ли это решение повлияет на разницу во времени зоны между клиент/серверной стороне моего приложения?

+1

Какова цель этого метода? Если вы хотите только день, месяц, год, используйте «Календарь». –

+0

всегда ли он до 23:00 в предыдущий день? Если это так, не можете ли вы добавить 1 час? – Cruncher

+0

Я читал, что объект «Календарь» учитывает часовой пояс. У меня есть веб-приложение, которое получает этот объект Date от клиента, и я не хочу, чтобы он зависел от часовых поясов. – Churro

ответ

7

Есть 24 часа в сутки. Используйте миллисекунды% (1000 * 60 * 60 * 24).

+0

Не работает: in: 'Tue Oct 01 11:15:08 PDT 2013' out:' Mon Sep 30 17:00:00 PDT 2013' – Churro

+4

Ну, как вы сказали, вы пытаетесь избежать летнего сбережения корректировки. Я считаю, что вы обнаружите, что 17:00:00 PDT - полночь GMT. Это ответ на вопрос, который вы задали ... Возможно, вы задаете неправильный вопрос. –

+0

Вы правы, я могу задать неправильный вопрос. Основная проблема заключается в том, что я хочу миллисекунды даты без времени. Может быть, я должен пойти другим путем? – Churro

2

Просто невозможно по вашему определению.

Миллисекундная временная метка представляет собой миллисекунды, прошедшие с фиксированной точки времени (1970-01-01 00: 00: 00.000 UTC, если я правильно помню). Эта метка времени не может быть преобразована в дату + время без указания часового пояса для преобразования.

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

Сделайте себе одолжение и используйте Календарь.

+0

Благодарим за отзыв. Кажется, я не понимал «Даты» слишком хорошо, и мне придется использовать «Календарь». – Churro

1

Вы можете использовать служебный класс DateUtils помощника apache.

Например, если вы имели DateTime от 28 марта 2002 13: 45: 01,231, если вы прошли с Calendar.HOUR, он вернется 28 Mar 2002 13: 00: 00.000. Если это было пройдено с Calendar.MONTH, это будет return 1 Mar 2002 0: 00: 00.000.

Date newDate = DateUtils.truncate(new Date(1408338000000L), Calendar.DAY_OF_MONTH); 

Вы можете скачать Commons Lang баночку в http://commons.apache.org/proper/commons-lang/

Смежные вопросы