programing

오늘 자정과 내일 자정이라는 Java Date 개체를 만들려면 어떻게 해야 합니까?

firstcheck 2022. 7. 30. 11:47
반응형

오늘 자정과 내일 자정이라는 Java Date 개체를 만들려면 어떻게 해야 합니까?

내 코드로 오늘 있었던 모든 일을 찾아야 해그래서 오늘 오전 00:00부터 오후 12:00까지와 비교해 볼 필요가 있습니다.

알아요...

Date today = new Date(); 

...당장 이해가 되네요.그리고...

Date beginning = new Date(0);

1970년 1월 1일엔 시간이 전혀 없어하지만 오늘은 제로 타임, 내일은 제로 타임으로 하는 쉬운 방법은 무엇일까요?


갱신하다

내가 이렇게 했는데 더 쉬운 방법은 없을까?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();
            
Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

java.displaces를 클릭합니다.캘린더

// today    
Calendar date = new GregorianCalendar();
// reset hour, minutes, seconds and millis
date.set(Calendar.HOUR_OF_DAY, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);

// next day
date.add(Calendar.DAY_OF_MONTH, 1);

JDK 8 - java.time.Local Time 및 java.time.로컬 날짜

LocalTime midnight = LocalTime.MIDNIGHT;
LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);

조다 타임

JDK < 8을 사용하는 경우 Joda Time을 권장합니다.API가 매우 좋기 때문입니다.

DateTime date = new DateTime().toDateMidnight().toDateTime();
DateTime tomorrow = date.plusDays(1);

Time Joda Time 2전 2 . 2 . 3 ★DateMidnight권장되지 않으므로 다음 명령을 사용합니다.

DateTime today = new DateTime().withTimeAtStartOfDay();
DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();

JVM의 현재 기본 표준 시간대를 사용하지 않으려면 표준 시간대를 통과하십시오.

DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.

완전성을 위해 Java 8을 사용하는 경우truncatedTo의 of의 InstantUTC에서 자정을 취득합니다.

Instant.now().truncatedTo(ChronoUnit.DAYS);

Javadoc에 기재된 바와 같이

예를 들어 MINUTS 유닛을 사용하여 잘라내면 가장 가까운 분으로 반올림되어 초수와 나노초가 0으로 설정됩니다.

도움이 됐으면 좋겠다.

자정을 찾는 가장 쉬운 방법:

Long time = new Date().getTime();
Date date = new Date(time - time % (24 * 60 * 60 * 1000));

다음 날:

Date date = new Date(date.getTime() + 24 * 60 * 60 * 1000);

ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ.Date는 날짜(!)를 나타내기 위해 사용되지 않습니다.날짜를 나타내려면 달력이 필요합니다.이것은, 다음과 같습니다.

Calendar c = new GregorianCalendar();

will a a a가 생성됩니다.Calendar현재 표준 시간대의 현재 날짜를 나타내는 인스턴스. 하루 의 모든 초, , 자르다, 자, 자, 자, 자, 자, 자, 자, 자, 자, 자)로 설정하면 됩니다.012시 정각

다음 날 자정을 얻으려면 하루를 추가해야 합니다.

c.add(Calendar.DAY_OF_MONTH, 1);

「」를 추가하는 .86400여름 시간 동안 발생할 수 있으므로 초 또는 24시간이 올바르지 않습니다.

업데이트: 그러나 이 문제를 해결하기 위해 Commons Lang의 Date Utils 클래스를 사용하는 것이 좋습니다.

Date start = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH))
Date end = DateUtils.addDays(start, 1);

it it를 한다.Calendar★★★★★★★★★★★★...

이 방법들은 당신에게 도움이 될 것이다.

public static Date getStartOfDay(Date date) {
     Calendar calendar = Calendar.getInstance();
     calendar.setTime(date);
     calendar.set(Calendar.HOUR_OF_DAY, 0);
     calendar.set(Calendar.MINUTE, 0);
     calendar.set(Calendar.SECOND, 0);
     calendar.set(Calendar.MILLISECOND, 0);
     return calendar.getTime();
 }

그리고.

public static Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 23);
    calendar.set(Calendar.MINUTE, 59);
    calendar.set(Calendar.SECOND, 59);
    calendar.set(Calendar.MILLISECOND, 999);
    return calendar.getTime();
}

다른 답변, 특히 arganzheng의 java.time 답변은 정확합니다.일부에서 언급했듯이 오래된 java.util은 피해야 합니다.날짜/.달력 클래스는 설계가 서툴고 혼란스러우며 번거롭기 때문에 작성한다.이들은 java.time 클래스로 대체되었습니다.

자정 및 시간 범위다루는 전략에 대한 메모를 추가하겠습니다.

하프 오픈

날짜 작업에서는 "Half-Open" 접근방식을 사용하여 시간 범위를 정의하는 경우가 많습니다.이 접근법에서는 시작은 포함되지만 끝은 배타적입니다.이렇게 하면 문제가 해결되며, 지속적으로 사용하면 날짜 처리에 대한 추론이 훨씬 쉬워집니다.

해결된 한 가지 문제는 하루의 끝을 정의하는 것입니다.의 마지막 23:59:59.999(밀리초)아마도 java.util에서.날짜 클래스(최초 Java에서 온 문제 발생 – 이 클래스를 피하십시오!) 및 매우 성공적인 Joda-Time 라이브러리에 있습니다.그러나 Postgres와 같은 데이터베이스와 같은 다른 소프트웨어에서 마지막 순간은 다음과 같습니다.23:59:59.999999(마이크로초).그러나 java.time 프레임워크(Joda-Time의 후속 버전인 Java 8 및 이후 버전)와 같은 다른 소프트웨어 및 H2 데이터베이스와 같은 일부 데이터베이스에서는 마지막 순간이 다음과 같을 수 있습니다.23:59.59.999999999(나노초)머리카락을 쪼개지 말고, 마지막 순간이 아닌 처음 순간으로만 생각하라.

Half-Open에서는 하루는 1일 중 첫 번째 순간부터 시작하여 다음 날 첫 번째 순간까지 올라가지만 포함되지 않습니다.그래서 이렇게 생각하는 게 아니라

…오늘부터 오전 00시(오늘 새벽)부터 오후 12시(오늘 밤 12시)까지.

…이렇게 생각합니다…

오늘의 첫 번째 순간부터 내일의 첫 번째 순간까지:
> = ( > =)00:00:00.0 AND < >00:00:00.0) (내일

데이터베이스 작업에서 이 방법은 SQL에서 연산자를 사용하지 않음을 의미합니다.

하루의 시작

게다가, 하루 중 첫 번째 순간이 항상 하루 중 시간이 되는 것은 아니다.00:00:00.0. 일부 시간대에서의 Daylight Saving Time(DST; 일광 절약 시간) 및 기타 이상 징후는 하루를 시작하는 다른 시간을 의미합니다.

따라서 java.time 클래스가 에 대한 콜을 사용하여 하루의 시작을 결정하는 작업을 수행하도록 합니다.따라서 이 코드 예에서 볼 수 있듯이 우회해서 돌아가야 합니다.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );

의 「」가 에 주의해 주세요.ZoneId생략하면 JVM의 현재 기본 시간대가 암묵적으로 적용됩니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

표준 시간대는 날짜 작업에 매우 중요합니다.가 시간대를 의식적으로 처리하지 않기 때문에 질문 및 기타 답변에 결함이 있을 수 있습니다.

변환

java.util을 사용해야 하는 경우.날짜 또는 .Calendar, 이전 클래스에 추가된 새 변환 메서드를 찾습니다.

java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );

시간 범위

덧붙여서, 많은 작업을 하고 있는 경우는, 다음의 점에 주의해 주세요.

  • Duration
  • Period
  • Interval
    Interval클래스는 java.time 프레임워크의 확장인 ThreeTen-Extra 프로젝트에 있습니다.이 프로젝트는 향후 java.time에 추가될 수 있는 검증의 장입니다.
    Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );

java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*②.

java.time 클래스는 어디서 얻을 수 있습니까?

쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 유용한 클래스가 있습니다.

.3, Time 2.3 재, 、toDateMidnight()을 사용하다

2.2에서 2.3으로의 업그레이드

2년 이후 폐지.2----------------------- Date Midnight [#41]이 반은 개념상 결함이 있다일부 시간대에서는 자정이 발생하지 않을 수 있습니다.이는 00:00부터 01:00까지의 여름 시간대의 결과입니다.Date Midnight는 기본적으로 시간이 자정까지 잠긴 Date Time입니다.LocalDate를 지정하면 이러한 개념은 일반적으로 사용하기 어렵습니다.DateMidnight를 LocalDate로 바꿉니다.또는 WithTimeAtStartOfDay() 메서드를 사용하여 DateTime으로 대체합니다.

.toDateMidnight()★★★★★★ 。

코드

DateTime todayAtMidnight = new DateTime().withTimeAtStartOfDay();
System.out.println(todayAtMidnight.toString("yyyy-MM-dd HH:mm:ss"));

출력(현지 시간대에 따라 다를있음)

2013-09-28 00:00:00

java.time

Java 8 이후를 사용하는 경우 java.time 패키지(튜토리얼)를 사용해 볼 수 있습니다.

LocalDate tomorrow = LocalDate.now().plusDays(1);
Date endDate = Date.from(tomorrow.atStartOfDay(ZoneId.systemDefault()).toInstant());

이것은 옵션인 것 같습니다.

DateFormat justDay = new SimpleDateFormat("yyyyMMdd");
Date thisMorningMidnight = justDay.parse(justDay.format(new Date()));

하루를 더하다

Date tomorrow = new Date(thisMorningMidnight.getTime() + 24 * 60 * 60 * 1000);

또는

Calendar c = Calendar.getInstance();
c.setTime(thisMorningMidnight);
c.add(Calendar.DATE, 1);
Date tomorrowFromCalendar = c.getTime();

서머타임이 24시간 연장되는 등 이상한 경우에는 후자를 선호합니다(https://stackoverflow.com/a/4336131/32453 및 기타 답변 참조).

JDK8 - Java 타임 모듈 방식:

LocalDateTime todayMidnight = LocalDate.now().atStartOfDay();

작업:

LocalDateTime todayMidnight = LocalDateTime.now().with(LocalTime.MIDNIGHT);

난 여기 있는 다른 사람들과 다르게 행동했어.자바가 처음이라 솔루션이 서툴러요.

Date now = new Date();
Date midnightToday = new Date(now.getYear(), now.getMonth(), now.getDate());

아직 효과가 있을지 모르겠지만, 어느 쪽이든 이 솔루션에 대한 피드백을 주시면 감사하겠습니다.

내일 전화로 계산하실 수 있다는 위의 설명에 혼란스럽습니다.

c.add(Calendar.DAY_OF_MONTH, 1);

1을 더해서 31일이 되면 32일이 나오지 않나요?

Java에서 시간/날짜가 모두 UTC를 기반으로 하지 않는 이유는 무엇입니까?Timezone은 I/O와 함께 사용할 때만 필요하지만 내부적으로는 항상 UTC로 사용해야 합니다.그러나 클래스에는 타임존 정보가 포함되어 있어 낭비적일 뿐만 아니라 코딩 오류가 발생하기 쉬운 것으로 보입니다.

이전 답변과 거의 비슷하지만 AM_PM 파라미터에 대해서는 언급하지 않았습니다.

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    cal.set(Calendar.AM_PM, Calendar.AM);

Apache Commons 사용 중...

//For midnight today 
Date today = new Date(); 
DateUtils.truncate(today, Calendar.DATE);

//For midnight tomorrow   
Date tomorrow = DateUtils.addDays(today, 1); 
DateUtils.truncate(tomorrow, Calendar.DATE);

Apache Commons Lang

DateUtils.isSameDay(date1, date2)

http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html#isSameDay(java.util 를 참조해 주세요.날짜, java.util.날짜)

Time Joda Time으로 가장

DateMidnight date = DateMidnight.now();

왜냐하면 하루는24 * 60 * 60 * 1000이은 ms 이음음음음음음음음음음음음음음음음음 ms ms ms ms ms ms ms ms ms ms ms ms ms ms ms .

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`
Date now= new Date();
// Today midnight
Date todayMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY);

// tomorrow midnight
Date tomorrowMidnight = new Date(endTime.getTime() -endTime.getTime()%DateUtils.MILLIS_PER_DAY + DateUtils.MILLIS_PER_DAY);

이 포스트가 아주 오래된 포스트라는 걸 알아요.나는 여기서 나의 지식을 공유하려고 생각했다!

정확한 표준 시간대가 설정된 오늘 한밤중에 다음 항목을 사용할 수 있습니다.

public static Date getCurrentDateWithMidnightTS(){

    return new Date(System.currentTimeMillis() - (System.currentTimeMillis()%(1000*60*60*24)) - (1000*60 * 330));
}

서 ★★★★★(1000*60 * 330)예를 들어 인도의 시간대와 같은 실제 시간대와 관련이 있는 경우, kolkata는 실제 시간대와 +5:30시간 차이가 납니다. 따라서 밀리초로 환산하면 이 값을 뺍니다.

그러니까 마지막으로 감산한 숫자를 당신 마음대로 바꾸세요.인도에서만 제품을 만들고 있기 때문에 특정 타임스탬프를 사용했을 뿐입니다.

Date todayMidnightUTC = java.sql.Date.valueOf(LocalDate.now());
Date tomorrowMidnightUTC = java.sql.Date.valueOf(LocalDate.now().plusDays(1));
Date anyMidnightLocal = java.sql.Date.valueOf(LocalDate.from(dateTime.toInstant().atZone(ZoneId.systemDefault())));

, 해 주십시오.java.sql.Date.toInstant() 던지다UnsupportedOperationException.

LocalDate 경유로 java.util로 이동합니다.가장 간단한 변환은 날짜와 그 반대입니까?

옛날 방식...

private static Date getDateWithMidnight(){
    long dateInMillis = new Date().getTime();
    return new Date(dateInMillis - dateInMillis%(1000*60*60*24) - TimeZone.getDefault().getOffset(dateInMillis));
}

언급URL : https://stackoverflow.com/questions/6850874/how-to-create-a-java-date-object-of-midnight-today-and-midnight-tomorrow

반응형