복붙노트

[SQL] 자바에서 타임 스탬프의 시간 부분을 재설정

SQL

자바에서 타임 스탬프의 시간 부분을 재설정

자바에서 어떻게 타임 스탬프는 특정 일의 자정을 나타내도록 00:00:00 혼자 시간 부분을 다시 설정하는 타임 스탬프를, 주어진?

T-SQL에서,이 쿼리는 동일을 달성 할 것입니다,하지만 난 자바에서이 작업을 수행하는 방법을 모르겠어요.

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

해결법

  1. ==============================

    1.당신은 날짜 -> 캘린더 -> 세트 -> 날짜를 갈 수 있습니다 :

    당신은 날짜 -> 캘린더 -> 세트 -> 날짜를 갈 수 있습니다 :

    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.sql.Timestamps를 사용하는 경우 참고, 그들은 여분의 나노 필드가있다. 물론 일정, 맹목적으로 무시하고 다음 새 Timetamp 객체를 생성하는 데 사용할 수있는 말에 zeroedDate을 만들 때 효과적으로 떨어집니다 그래서 나노 아무것도 모른다.

    나는 또한 달력 스레드로부터 안전하지 않습니다, 그래서 당신은 여러 스레드에서 호출 정적 단일 칼 인스턴스가 새 달력 인스턴스를 생성하지 않도록하는 것을 확인 할 수 있습니다 생각하지 않습니다주의해야한다.

  2. ==============================

    2.당신이 공유지를 사용하는 경우 LANG 당신은 DateUtils.truncate를 호출 할 수 있습니다. 여기에 Javadoc 문서입니다.

    당신이 공유지를 사용하는 경우 LANG 당신은 DateUtils.truncate를 호출 할 수 있습니다. 여기에 Javadoc 문서입니다.

    그것은 @ 알렉스 밀러가해야 할 말했다 같은 일을한다.

  3. ==============================

    3.신기원의 시작 (1970 년 1 월 1 일) 이후 밀리 초 단위로 표시되는 java.util.Date, 당신의 "타임 스탬프를"있는 가정하면, 다음과 같은 연산을 수행 할 수 있습니다 :

    신기원의 시작 (1970 년 1 월 1 일) 이후 밀리 초 단위로 표시되는 java.util.Date, 당신의 "타임 스탬프를"있는 가정하면, 다음과 같은 연산을 수행 할 수 있습니다 :

    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. ==============================

    4.나는이 솔루션을 선호 :

    나는이 솔루션을 선호 :

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

    5.이 작업을 수행

    이 작업을 수행

    import org.apache.commons.lang.time.DateUtils;
    
    Date myDate = new Date();
    System.out.println(myDate);        
    System.out.println(DateUtils.truncate(myDate, Calendar.DATE));
    

    출력은

    수요일 3월 19일 태평양 서머 타임 14시 16분 47초 2014 수요일 3월 19일 태평양 서머 타임 00시 00분 0초 2014

  6. ==============================

    6.나는 많은 날짜 시간 조작을하지 않기 때문에,이 힘은 그것을 할 수있는 가장 좋은 방법이 될 수 없습니다. 나는 달력을 산란하고 소스로 날짜를 사용합니다. 그런 다음 0으로 시간, 분, 초를 설정하고 날짜로 다시 변환합니다. 하지만, 더 나은 방법을 볼 것이 좋을 것이다.

    나는 많은 날짜 시간 조작을하지 않기 때문에,이 힘은 그것을 할 수있는 가장 좋은 방법이 될 수 없습니다. 나는 달력을 산란하고 소스로 날짜를 사용합니다. 그런 다음 0으로 시간, 분, 초를 설정하고 날짜로 다시 변환합니다. 하지만, 더 나은 방법을 볼 것이 좋을 것이다.

  7. ==============================

    7.certanly 솔루션 "이 책에서"이 될 것이라고는 Calendar.set ()를 사용하여,하지만 당신은 또한 java.sql.Date을 사용할 수 있습니다 :

    certanly 솔루션 "이 책에서"이 될 것이라고는 Calendar.set ()를 사용하여,하지만 당신은 또한 java.sql.Date을 사용할 수 있습니다 :

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

    그게 정확히부터 원하는 것을 할 것입니다 :

    java.sql.Date은 java.util.Date를 확장 때문에, 당신은 자유롭게 등으로 사용할 수 있습니다. 당신이 할 이유가 없습니다 java.sql.Date에서 다른 java.util.Date을 만들 것을 -하지만 wantedDate.getTime ()가 원래의 타임 스탬프를 검색 할 것이라는 점을 알고 있어야합니다!

  8. ==============================

    8.Joda 시간과 지원 시간대를 사용하는 솔루션을 검색 할 수 있습니다. 그래서, 당신은 JVM에서 현재 구성된 시간대에 현재 날짜와 시간 (하는 currentDate 및 currentTime을에) 또는 (informedDate 및 informedTime에) 당신이 통보 약간의 날짜와 시간을 얻을 것이다.

    Joda 시간과 지원 시간대를 사용하는 솔루션을 검색 할 수 있습니다. 그래서, 당신은 JVM에서 현재 구성된 시간대에 현재 날짜와 시간 (하는 currentDate 및 currentTime을에) 또는 (informedDate 및 informedTime에) 당신이 통보 약간의 날짜와 시간을 얻을 것이다.

    또한 정보 용 아래의 코드는 정보를 날짜 / 시간은 미래 (가변 스케줄)에있는 경우.

    Joda 시간 윤초를 지원하지 않습니다주십시오 사항. 그래서, 당신은 진정한 가치 떨어져 일부 26 27초 될 수 있습니다. 누적 된 오류가 가까이 1 분에있을 것이다 사람들이 그것에 대해 신경을 시작할 때 이것은 아마 단지, 향후 50 년 안에 해결 될 것입니다.

    참조 : 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;
        }
    }
    
  9. ==============================

    9.다음은 주요 예를 들어 간단한 기능이다 :

    다음은 주요 예를 들어 간단한 기능이다 :

    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));
    }
    }
    
  10. ==============================

    10.캘린더를 사용 답변도 유효하지만 그냥 자바-8에 대한 대답을 넣어 위해 노력하지만, 사람들이 많이 더 이상 그 클래스를 사용하고 있지 않습니다.

    캘린더를 사용 답변도 유효하지만 그냥 자바-8에 대한 대답을 넣어 위해 노력하지만, 사람들이 많이 더 이상 그 클래스를 사용하고 있지 않습니다.

    SO는 java.time.ZonedDateTime &의 java.sql.Timestamp 사이의 변환을 이해하기 위해이 &이 답변을 참조하십시오

    당신은 단순히 일 및 타임 스탬프로 재 변환의 뒷면에 ZonedDateTime을자를 수 있습니다

    Timestamp.valueOf(ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS).toLocalDateTime())
    
  11. from https://stackoverflow.com/questions/227007/resetting-the-time-part-of-a-timestamp-in-java by cc-by-sa and MIT license