Вопрос

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

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

ВЫБЕРИТЕ CAST (FLOOR (CAST (GETDATE () AS FLOAT)) AS DATETIME) AS 'DateTimeAtMidnight';

Это было полезно?

Решение

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

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.

Другие советы

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

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

Предполагая, что ваша " временная метка " является 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);
}

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

GregorianCalendar now = new GregorianCalendar();
GregorianCalendar calendar = new GregorianCalendar(
              now.get(GregorianCalendar.YEAR), now.get(GregorianCalendar.MONTH), 
              now.get(GregorianCalendar.DAY_OF_MONTH));

Сделай это

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

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

Использование 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!

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

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

Обратите внимание, что 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;
    }
}

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

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));
}
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top