[java] 시간을 00:00:00으로 설정

Java에서 시간을 재설정하는 데 문제가 있습니다. 주어진 날짜에 대해 시간을 00:00:00으로 설정하고 싶습니다.

이것은 내 코드입니다.

/**
     * Resets milliseconds, seconds, minutes and hours from the provided date
     *
     * @param date
     * @return
     */
    public static Date trim(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.HOUR, 0);

        return calendar.getTime();
    }

문제는 때로 시간이 12:00:00있고 때로는 그럴 때가 00:00:00있고 데이터베이스에서 저장된 07.02.2013 00:00:00엔터티와 저장된 실제 엔터티 시간을 12:00:00쿼리 할 때 쿼리가 실패 한다는 것입니다 .

알아 12:00:00 == 00:00:00!

AppEngine을 사용하고 있습니다. AppEngine 버그, 문제 또는 기타 문제입니까? 아니면 다른 것에 의존합니까?



답변

대신 다른 상수를 Calendar.HOUR사용하고 Calendar.HOUR_OF_DAY.

calendar.set(Calendar.HOUR_OF_DAY, 0);

Calendar.HOUR0-11 (AM / PM과 함께 사용)을 Calendar.HOUR_OF_DAY사용하고 0-23을 사용합니다.

Javadocs를 인용하려면 :

public static final int HOUR

오전 또는 오후 시간을 나타내는 get 및 set 필드 번호입니다. HOUR는 12 시간제 (0-11)에 사용됩니다. 정오와 자정은 12가 아닌 0으로 표시됩니다. 예를 들어 오후 10 : 04 : 15.250에 HOUR는 10입니다.

public static final int HOUR_OF_DAY

시간을 나타내는 get 및 set 필드 번호입니다. HOUR_OF_DAY는 24 시간 제로 사용됩니다. 예를 들어 오후 10 : 04 : 15.250에 HOUR_OF_DAY는 22입니다.

테스트 ( “현재”는 현재 태평양 일광 절약 시간 2013 년 7 월 23 일 14:55 경) :

public class Main
{
   static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        now.set(Calendar.HOUR, 0);
        now.set(Calendar.MINUTE, 0);
        now.set(Calendar.SECOND, 0);
        System.out.println(sdf.format(now.getTime()));
        now.set(Calendar.HOUR_OF_DAY, 0);
        System.out.println(sdf.format(now.getTime()));
    }
}

산출:

$ javac Main.java
$ java Main
2013-07-23 12:00:00
2013-07-23 00:00:00


답변

java.time

java.timeJava 8 이상에 내장 된 프레임 워크를 사용합니다 . 튜토리얼을 참조하십시오 .

import java.time.LocalTime;
import java.time.LocalDateTime;

LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224
# start of a day
now.with(LocalTime.MIN); # 2015-11-19T00:00
now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00

시간 (시, 분, 초 등)이 필요하지 않은 경우 LocalDate클래스 사용을 고려하십시오 .

LocalDate.now(); # 2015-11-19


답변

이 작업을 수행하는 데 사용하는 몇 가지 유틸리티 함수가 있습니다.

/**
 * sets all the time related fields to ZERO!
 *
 * @param date
 *
 * @return Date with hours, minutes, seconds and ms set to ZERO!
 */
public static Date zeroTime( final Date date )
{
    return DateTimeUtil.setTime( date, 0, 0, 0, 0 );
}

/**
 * Set the time of the given Date
 *
 * @param date
 * @param hourOfDay
 * @param minute
 * @param second
 * @param ms
 *
 * @return new instance of java.util.Date with the time set
 */
public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms )
{
    final GregorianCalendar gc = new GregorianCalendar();
    gc.setTime( date );
    gc.set( Calendar.HOUR_OF_DAY, hourOfDay );
    gc.set( Calendar.MINUTE, minute );
    gc.set( Calendar.SECOND, second );
    gc.set( Calendar.MILLISECOND, ms );
    return gc.getTime();
}


답변

JAVA 8 방법 :

LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS);

그러나 이미 존재하는 날짜를 편집하는 것이 훨씬 더 유용합니다.


답변

주로 다음과 같이 DateFormat 구성 요소에 시간대를 설정하는 것이 좋습니다.

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));

그런 다음 0 밀리 초를 포맷터에 전달하여 “00:00:00″시간을 얻을 수 있습니다.

String time = dateFormat.format(0);

또는 Date 객체를 만들 수 있습니다.

Date date = new Date(0); // also pass milliseconds
String time = dateFormat.foramt(date);

또는 캘린더 구성 요소를 사용하여 더 많은 가능성을 가질 수 있지만 캘린더 인스턴스에 대해 시간대를 GMT로 설정해야합니다.

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US);
calendar.set(Calendar.HOUR_OF_DAY, 5);
calendar.set(Calendar.MINUTE, 37);
calendar.set(Calendar.SECOND, 27);

dateFormat.format(calendar.getTime());


답변

tl; dr

myJavaUtilDate                                 // The terrible `java.util.Date` class is now legacy. Use *java.time* instead.
.toInstant()                                   // Convert this moment in UTC from the legacy class `Date` to the modern class `Instant`.
.atZone( ZoneId.of( "Africa/Tunis" ) )         // Adjust from UTC to the wall-clock time used by the people of a particular region (a time zone).
.toLocalDate()                                 // Extract the date-only portion.
.atStartOfDay( ZoneId.of( "Africa/Tunis" ) )   // Determine the first moment of that date in that zone. The day does *not* always start at 00:00:00.

java.time

JSR 310에 정의 된 최신 java.time 클래스로 몇 년 전에 대체되었던 끔찍한 오래된 날짜-시간 클래스를 사용하고 있습니다.

DateInstant

A는 java.util.DateUTC의 순간을 나타냅니다. 대체는 Instant. 이전 클래스에 추가 된 새 변환 메서드를 호출합니다.

Instant instant = myJavaUtilDate.toInstant() ;

시간대

새 시간을 의미 할 시간대를 지정하십시오.

지정 적절한 시간대 이름 의 형식 Continent/Region예컨대, America/Montreal, Africa/Casablanca, 또는 Pacific/Auckland. EST또는 같은 2-4 자의 약어 IST는 표준 시간대 가 아니고 , 표준화되지 않았으며, 고유하지도 않은 (!)이므로 절대 사용하지 마십시오 .

ZoneId z = ZoneId.of( "America/Montreal" ) ;

ZonedDateTime

을 적용 ZoneId받는 Instant를 얻을 ZonedDateTime. 같은 순간, 타임 라인의 같은 지점이지만 벽시계 시간은 다릅니다.

ZonedDateTime zdt = instant.atZone( z ) ;

시간 변경

시간 변경을 요청하셨습니다. a LocalTime를 적용하여 모든 시간 부분 (시, 분, 초, 분수 초)을 변경합니다. 새 ZonedDateTime값은 원본을 기반으로 인스턴스화됩니다. java.time의 수업이 사용하는 불변의 객체를 제공하는 패턴을 스레드 안전을 .

LocalTime lt = LocalTime.of( 15 , 30 ) ;  // 3:30 PM.
ZonedDateTime zdtAtThreeThirty = zdt.with( lt ) ; 

하루의 첫 순간

하지만 특별히 00:00을 요청하셨습니다. 그래서 분명히 당신은 하루의 첫 순간을 원합니다. 주의 : 일부 구역의 어떤 날은 00:00:00에 시작하지 않습니다. DST (일광 절약 시간)와 같은 예외로 인해 01:00:00과 같은 다른 시간에 시작할 수 있습니다.

하자 java.time는 첫 순간을 결정합니다. 날짜 전용 부분을 추출하십시오. 그런 다음 첫 번째 순간을 얻기 위해 시간대를 통과하십시오.

LocalDate ld = zdt.toLocalDate() ;
ZonedDateTime zdtFirstMomentOfDay = ld.atStartOfDay( z ) ;

UTC로 조정

UTC로 돌아 가야하는 경우 Instant.

Instant instant = zdtFirstMomentOfDay.toInstant() ;

InstantDate

당신이 필요로하는 경우는 java.util.Date아직 업데이트되지 이전 코드와 상호 운용 할 수 java.time , 변환.

java.util.Date d = java.util.Date.from( instant ) ;


답변

이 작업이 더 쉬울 수 있습니다 (Java 8에서).

LocalTime.ofNanoOfDay(0)