Сброс части времени метки времени в Java - PullRequest
38 голосов
/ 22 октября 2008

В Java, учитывая временную метку, как сбросить одну только временную часть до 00:00:00, чтобы метка времени представляла полночь этого конкретного дня?

В T-SQL этот запрос будет выполнять то же самое, но я не знаю, как это сделать в Java.

SELECT CAST( FLOOR( CAST(GETDATE() AS FLOAT ) ) AS DATETIME) AS 'DateTimeAtMidnight';

Ответы [ 9 ]

75 голосов
/ 22 октября 2008

Вы можете перейти Дата-> Календарь-> Установить-> Дата:

Date date = new Date();                      // timestamp now
Calendar cal = Calendar.getInstance();       // get calendar instance
cal.setTime(date);                           // set cal to date
cal.set(Calendar.HOUR_OF_DAY, 0);            // set hour to midnight
cal.set(Calendar.MINUTE, 0);                 // set minute in hour
cal.set(Calendar.SECOND, 0);                 // set second in minute
cal.set(Calendar.MILLISECOND, 0);            // set millis in second
Date zeroedDate = cal.getTime();             // actually computes the new Date

Я люблю свидания на Java.

Обратите внимание, что если вы используете фактические java.sql.Timestamps, у них есть дополнительное поле nanos. Календарь, конечно же, ничего не знает о нанослоях, поэтому будет слепо игнорировать его и эффективно отбрасывать при создании нулевой даты в конце, которую вы затем сможете использовать для создания нового объекта Timetamp.

Я также должен отметить, что Calendar не является потокобезопасным, поэтому не думайте, что вы можете сделать этот статический единственный экземпляр cal, вызываемый из нескольких потоков, чтобы избежать создания новых экземпляров Calendar.

18 голосов
/ 23 октября 2008

Если вы используете общий язык, вы можете позвонить DateUtils.truncate. Вот документация javadoc .

Он делает то же самое, что сказал Алекс Миллер.

7 голосов
/ 22 октября 2008

Предполагая, что вашей "отметкой времени" является java.util.Date, которая представлена ​​в виде количества миллисекунд с начала эпохи (1 января 1970 г.), вы можете выполнить следующую арифметику:

public static Date stripTimePortion(Date timestamp) {
    long msInDay = 1000 * 60 * 60 * 24; // Number of milliseconds in a day
    long msPortion = timestamp.getTime() % msInDay;
    return new Date(timestamp.getTime() - msPortion);
}
4 голосов
/ 20 марта 2014

Сделай это

import org.apache.commons.lang.time.DateUtils;

Date myDate = new Date();
System.out.println(myDate);        
System.out.println(DateUtils.truncate(myDate, Calendar.DATE));

и вывод

Ср 19 марта 14:16:47 PDT 2014
Ср 19 марта 00:00:00 PDT 2014

4 голосов
/ 20 ноября 2012

Я предпочитаю это решение:

GregorianCalendar now = new GregorianCalendar();
GregorianCalendar calendar = new GregorianCalendar(
              now.get(GregorianCalendar.YEAR), now.get(GregorianCalendar.MONTH), 
              now.get(GregorianCalendar.DAY_OF_MONTH));
1 голос
/ 22 октября 2008

Поскольку я мало занимаюсь манипуляциями с DateTime, возможно, это не лучший способ сделать это. Я бы породил календарь и использовал бы дату в качестве источника. Затем установите часы, минуты и секунды на 0 и конвертируйте обратно в дату. Хотя было бы неплохо увидеть лучший способ.

0 голосов
/ 18 января 2017

Вот простая функция с основным примером:

import java.util.Calendar;
import java.util.Date;
public class Util {
/**
 * Returns an imprecise date/timestamp. 
 * @param date
 * @return the timestamp with zeroized seconds/milliseconds
 */
public static Date getImpreciseDate(Date date) {
   Calendar cal = Calendar.getInstance(); // get calendar instance
   cal.setTime(date);// set cal to date
   cal.set(Calendar.SECOND, 0); // zeroize seconds 
   cal.set(Calendar.MILLISECOND, 0);   // zeroize milliseconds
   return cal.getTime();
}

public static void main(String[] args){
   Date now = new Date();
   now.setTime(System.currentTimeMillis()); // set time to now
   System.out.println("Precise date:  " + Util.getImpreciseDate(now));
   System.out.println("Imprecise date:  " + Util.getImpreciseDate(now));
}
}
0 голосов
/ 10 июля 2015

Найдите ниже решение, которое использует Joda Time и поддерживает часовые пояса. Таким образом, вы получите текущую дату и время (в currentDate и currentTime) или некоторую дату и время, которые вы сообщите (в informedDate и informedTime) в текущем настроенном часовом поясе в JVM.

Приведенный ниже код также информирует, будет ли указанная дата / время в будущем (переменная schedulable).

Обратите внимание, что Joda Time не поддерживает високосных секунд . Таким образом, вы можете быть на 26 или 27 секунд меньше истинного значения. Вероятно, это будет решено только в течение следующих 50 лет, когда накопленная ошибка будет ближе к 1 минуте, и люди начнут заботиться об этом.

Смотри также: https://en.wikipedia.org/wiki/Leap_second

/**
 * This class splits the current date/time (now!) and an informed date/time into their components:
 * <lu>
 *     <li>schedulable: if the informed date/time is in the present (now!) or in future.</li>
 *     <li>informedDate: the date (only) part of the informed date/time</li>
 *     <li>informedTime: the time (only) part of the informed date/time</li>
 *     <li>currentDate: the date (only) part of the current date/time (now!)</li>
 *     <li>currentTime: the time (only) part of the current date/time (now!)</li>
 * </lu>
 */
public class ScheduleDateTime {
    public final boolean schedulable;
    public final long millis;
    public final java.util.Date informedDate;
    public final java.util.Date informedTime;
    public final java.util.Date currentDate;
    public final java.util.Date currentTime;

    public ScheduleDateTime(long millis) {
        final long now = System.currentTimeMillis();
        this.schedulable = (millis > -1L) && (millis >= now);

        final TimeZoneUtils tz = new TimeZoneUtils();

        final java.util.Date          dmillis   = new java.util.Date( (millis > -1L) ? millis : now );
        final java.time.ZonedDateTime zdtmillis = java.time.ZonedDateTime.ofInstant(dmillis.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdmillis  = java.util.Date.from(tz.tzdate(zdtmillis));
        final java.util.Date          ztmillis  = new java.util.Date(tz.tztime(zdtmillis));

        final java.util.Date          dnow   = new java.util.Date(now);
        final java.time.ZonedDateTime zdtnow = java.time.ZonedDateTime.ofInstant(dnow.toInstant(), java.time.ZoneId.systemDefault());
        final java.util.Date          zdnow  = java.util.Date.from(tz.tzdate(zdtnow));
        final java.util.Date          ztnow  = new java.util.Date(tz.tztime(zdtnow));

        this.millis       = millis;
        this.informedDate = zdmillis;
        this.informedTime = ztmillis;
        this.currentDate  = zdnow;
        this.currentTime  = ztnow;
    }
}



public class TimeZoneUtils {

    public java.time.Instant tzdate() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tzdate(zdtime);
    }
    public java.time.Instant tzdate(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final java.time.Instant instant = zddate.toInstant();
        return instant;
    }

    public long tztime() {
        final java.time.ZonedDateTime zdtime = java.time.ZonedDateTime.now();
        return tztime(zdtime);
     }
    public long tztime(java.time.ZonedDateTime zdtime) {
        final java.time.ZonedDateTime zddate = zdtime.truncatedTo(java.time.temporal.ChronoUnit.DAYS);
        final long millis = zddate.until(zdtime, java.time.temporal.ChronoUnit.MILLIS);
        return millis;
    }
}
0 голосов
/ 22 октября 2008

Использование Calendar.set () определенно будет решением «по книге», но вы также можете использовать java.sql.Date:

java.util.Date originalDate = new java.util.Date();
java.sql.Date wantedDate = new java.sql.Date(originalDate.getTime());

Это будет делать именно то, что вы хотите, так как:

Чтобы соответствовать определению SQL DATE, значения миллисекунд, обернутые экземпляром java.sql.Date, должны быть «нормализованы» путем установки часов, минут, секунд и миллисекунд на ноль в конкретном часовом поясе, с которым Экземпляр связан.

Поскольку java.sql.Date расширяет java.util.Date, вы можете свободно использовать его как таковой. Имейте в виду, что wantedDate.getTime () получит исходную временную метку - поэтому вы не хотите создавать другую java.util.Date из java.sql.Date!

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