오늘 자정과 내일 자정의 Java Date 객체를 만드는 방법은 무엇입니까?


178

내 코드에서 오늘 일어난 모든 일을 찾아야합니다. 따라서 오늘 00:00 am (오늘 아침 자정)부터 12:00 pm (오늘 자정)까지의 날짜와 비교해야합니다.

알아 ...

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();

3
내 생각에 Joda Time은 더 쉽다. 내 대답의 끝을보십시오. java.util.Date/Calendar를 사용하려면이 방법을 사용해야하며 더 쉬운 방법은 없습니다.
timaschew

RE : timaschew는 Joda-Time을 사용하고 Joda-Time 프로젝트가 현재 유지 보수 모드임을 알고 java.time 클래스로의 마이그레이션을 권고합니다.
Basil Bourque

1
참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

2
이 질문에 대해 너무 많은 결함이있는 답변을 보는 것은 드 dom니다. Basil Bourque의 답변을 추천 합니다 . 정확하고 지식이 풍부합니다.
Ole VV

답변:


344

java.util.Calendar

// 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.LocalTime 및 java.time.LocalDate

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을 사용하는 경우 API가 정말 좋기 때문에 Joda Time을 권장합니다 .

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

Joda Time 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.

도움을 주셔서 감사합니다. 방금 원래 질문을 현재 어떻게 수행했는지 업데이트했습니다. 제안 해 주셔서 감사합니다.

3
JodaTime 2.3부터는 toDateMidnight더 이상 사용되지 않습니다. 자세한 내용은이 답변을 참조하십시오. stackoverflow.com/a/19048833/363573
Stephan

JDK 8에 대한 솔루션 추가
timaschew

1
@timaschew 일반적으로 정확하지만 ZonedDateTimeJoda-Time 섹션에서와 같이 영역 날짜 / 시간 값 ( )을 사용하여 java.time을 수행하는 것이 좋습니다 . Local…더 잃게 / 무시 모든 오프셋 및 시간대 세부 사항 그들의 전체 목적입니다 - 종류는 어떤 시간대 정보가 없습니다. 특히 질문에서 비교를 위해 이러한 값을 사용하는 것에 대해 이야기 할 때 (데이터베이스 쿼리 일 수 있습니까?), 존 날짜 / 시간 값이 더 유용 할 것입니다.
Basil Bourque

1
@Amalgovinus Calendar.HOUR가 아니라 Calendar.HOUR_OF_DAY를 설정해야합니다.
Oswald

43

완전성을 위해 Java 8 을 사용하는 truncatedTo경우 Instant클래스 의 메소드를 사용하여 UTC 자정을 얻을 수도 있습니다 .

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

Javadoc에 작성된

예를 들어, MINUTES 단위로 자르면 가장 가까운 분으로 반올림하여 초와 나노초를 0으로 설정합니다.

도움이 되길 바랍니다.


1
힌트 주셔서 감사합니다. 지정된 시간대에 자정을 얻는 것이 더 길어집니다 :Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
Vadzim 2016 년


33

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

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);

나는 그 코드를 실행했고 다음을 얻었다 : 자정 : Thu 11 월 01 일 19:00:00 CDT 2012
Dave

3
System.out.print (date)와 같은 작업을 수행 한 경우 시스템은 날짜 인스턴스를 시스템 시간대 (CDT)로 변환했습니다. CDT의 오후 7시는 GMT의 자정입니다. 선택한 표준 시간대에 자정이 필요한 경우 DST를 고려하여이 표준 시간대 오프셋을 추가해야합니다.
Andrei Volgin

@Bouncner입니다. 어떤 방법을 사용하든 지구상에는 여러 가지 '자정'시간이 있지만 Java 자정은 하나뿐입니다.
Andrei Volgin

2
@Andrei Volgin "자바 자정"이 있다는 것을 몰랐습니다. ;)이 솔루션이 주제 제작자를 실제로 돕는 것은 아니라고 말하고 싶었습니다. 캘린더 솔루션은 적절하게 사용될 때 추악한 초 계산을 피하고 시간대 (특히 일광 절약 시간 등)를 관리합니다. 나는 당신의 해결책에서 그것을 보지 못합니다.
Bouncner

@AndreiVolgin 안녕하세요, Date date = new Date (time + TimeZone.getDefault (). getRawOffset ()-time % (24 * 60 * 60 * 1000));
jrey

28

기억, Date표현하는 데 사용되지 않습니다 날짜를 (!). 날짜를 나타내려면 달력이 필요합니다. 이:

Calendar c = new GregorianCalendar();

Calendar현재 시간대의 현재 날짜를 나타내는 인스턴스 를 만듭니다 . 이제 필요한 것은로 설정하여 하루 (시, 분, 초 및 밀리 초) 아래의 모든 필드를 잘라내는 것 0입니다. 오늘 자정이되었습니다.

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

c.add(Calendar.DAY_OF_MONTH, 1);

86400그 동안 발생할 수있는 여름 시간으로 인해 초 또는 24 시간 을 추가하는 것은 올바르지 않습니다.

업데이트 : 그러나이 문제를 처리하는 가장 좋아하는 방법 은 Commons Lang의 DateUtils 클래스 를 사용하는 것입니다 .

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

그것은 Calendar무대 뒤에서 사용 합니다 ...


15
도와 주셔서 감사합니다. "날짜는 날짜를 나타내는 데 사용되지 않습니다"– 우리는 꽤 놀라 울 정도로 놀랍지 않습니까? ;)

@RobertHume 공정하게 말하면 Date는 Java의 첫 번째 릴리스 이후로 사용되었습니다. 그 시대의 대부분은 완벽하게 생각한 것보다 적습니다. 특히 자바가 시도한 것들을 시도한 최초의 사람들 중 하나 였기 때문에, 자바가 그것을 수행하는 방법에 대한 합의 된 표준 과는 거리멀었다 .
기금 모니카의 소송

14

이 방법들이 도움이 될 것입니다.

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();
}

9

JodaTime 2.3부터는 toDateMidnight()더 이상 사용되지 않습니다.

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

    2.2 이후의 지원 중단
    ----------------------
    -DateMidnight [# 41]
     이 수업은 개념에 결함이 있습니다
     일부 시간대에서는 자정 시간이 가끔 발생하지 않습니다.
     이는 일광 절약 시간 제로 00:00부터 01:00까지입니다.
     DateMidnight는 기본적으로 자정에 시간이 고정 된 DateTime입니다.
     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

2
훌륭한 답변입니다. 기본 설정에 따라 실수로 표준 시간대를 지정하는 것이 아니라 시간대를 지정하는 것의 중요성을 강조 DateTimeZone하기 위해 해당 DateTime생성자에 인스턴스를 추가하는 것도 추가 할 것입니다 .DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
Basil Bourque

9

다른 답변, 특히 arganzhengjava.time 답변이 정확 합니다. 일부 언급했듯이, 오래된 java.util.Date/.Calendar 클래스는 잘못 설계되고 혼란스럽고 번거로우므로 피해야합니다. 그것들은 java.time 클래스에 의해 대체되었습니다.

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

반 오픈

날짜-시간 작업에서 시간 범위는 종종 "하프-오픈"접근 방식을 사용하여 정의됩니다. 이 접근법에서 시작은 포괄적 인 반면 결말은 독점적 입니다. 이렇게하면 문제가 해결되고 일관되게 사용하면 날짜-시간 처리에 대한 추론이 훨씬 쉬워집니다.

해결 된 한 가지 문제는 하루의 끝을 정의하는 것입니다. 오늘의 마지막 순간 23:59:59.999( 밀리 초 )입니까? 아마도 java.util.Date 클래스 (최초의 Java에서; 번거 로움 –이 클래스를 피하십시오!)에서 그리고 매우 성공적인 Joda-Time 라이브러리에서. 그러나 Postgres와 같은 데이터베이스와 같은 다른 소프트웨어에서 마지막 순간은 23:59:59.999999( 마이크로 초 )입니다. 그러나 java.time 프레임 워크 (Java 8 이상에 내장되어 Joda-Time의 후속 제품)와 같은 다른 소프트웨어와 H2 Database 와 같은 일부 데이터베이스 에서는 마지막 순간이 23:59.59.999999999( 나노초 ) 일 수 있습니다 . 머리카락을 나누는 대신 마지막 순간이 아니라 첫 순간 만 생각하십시오.

Half-Open에서 하루는 하루 의 첫 순간부터 시작하여 다음 날의 첫 순간 까지는 포함되지 않습니다 . 따라서 다음과 같이 생각하십시오.

… 오늘 00:00 am (오늘 아침 자정)부터 12:00 pm (오늘 자정)까지.

… 이런 생각…

오늘의 첫 순간부터 내일의 첫 순간까지는 포함하지 않음 :
(> = 00:00:00.0today AND < 00:00:00.0tomorrow)

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

하루의 시작

또한 하루 중 첫 순간이 항상 시간 이 아닙니다00:00:00.0 . 일부 시간대의 일광 절약 시간 (DST) 및 기타 이상 현상은 하루가 시작되는 다른 시간을 의미 할 수 있습니다.

따라서 java.time 클래스를 호출하여 하루의 시작을 결정하는 작업을 수행하십시오 LocalDate::atStartOfDay( ZoneId ). 우리는을 통해 우회 할 수 있도록 LocalDate하고 다시 ZonedDateTime이 예제 코드에서 볼 수 있습니다.

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.Date가 나 .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의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

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

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


6

java.time

Java 8 이상을 사용하는 경우 java.time 패키지 ( Tutorial )를 사용해 볼 수 있습니다 .

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

2
좋은 대답입니다. 원하는 시간대를 지정하는 것이 좋습니다. JVM의 현재 기본 시간대는 OS 설정, 컴퓨터 변경 또는 런타임 동안 언제든지 기본값을 변경하는 JVM 스레드의 모든 앱에 따라 다를 수 있습니다.
Basil Bourque

4

이것은 옵션으로 보입니다 :

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 및 기타 답변 참조).


sqlite 데이터베이스에서 날짜와 시간을 길게 표시했습니다. 다음 날의 시작을 위해 긴 시간이 필요합니다. 위에서 사용하는 SimpleDateFormat 메서드가 아닌 long으로 Date 객체를 계속 사용할 수 있습니까?
AJW

1
올바른 밀리 초라면 생성자로 전달할 수 있습니다. docs.oracle.com/javase/7/docs/api/java/util/…
rogerdpack

1

나는 여기의 다른 사람들과는 다르게 이것을했다. Java를 처음 사용하므로 솔루션이 좋지 않을 수 있습니다.

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를 기반으로하지 않는 이유는 무엇입니까? 시간대는 i / o와 함께 사용할 때만 필요하지만 내부적으로 항상 UTC로 사용해야한다고 생각합니다. 그러나 클래스에는 시간 정보가 포함되어있는 것 같습니다. 시간 정보는 낭비 일뿐 만 아니라 코딩 오류가 발생하기 쉽습니다.


2
안녕 미치 귀하의 솔루션이 효과가 있다고 생각하지만 Date 생성자가 더 이상 사용되지 않는 것 같습니다. Java 사람들은 원래 Date 관련 메소드의 대부분을 더 이상 사용하지 않고 새로운 Calendar 관련 메소드로 대체했습니다. 개인적으로 나는 그것이 어떻게 개선되는지 알지 못하지만 더 이상 사용되지 않는 방법을 사용하는 것에 눈을 ed습니다. 감사!

지원 중단에 대해 슬프다. 시간, 분, 초 및 밀리 세크를 지우는 대신 연도, 월 및 날짜를 ​​지정하는 것이 훨씬 더 깨끗해 보입니다. 이것을 지우는 것은 Date 클래스의 가장 세분화 된 millisecs에 의존하지만 내 솔루션은 그렇지 않습니다. 내 솔루션도 더 짧고 명확합니다. Java를 처음 접하면 날짜와 시간을 사용할 때 C ++이 얼마나 깨끗하고 쉽고 효율적인지 정말 감사하게 생각합니다.
Mitch

@Mitch 내 경험상, 가장 최근에 배우고있는 언어는 항상 가장 복잡한 것으로 인식됩니다.
ArtOfWarfare

참고로,이 피 묻은 끔찍한 오래된 날짜-시간 클래스는 이제 현대적인 java.time 클래스로 대체되었습니다.
Basil Bourque


0

JodaTime을 사용하는 가장 간단한 방법

DateMidnight date = DateMidnight.now();


2
Joda-Time의 "자정"관련 클래스 및 메서드는 더 이상 사용되지 않습니다. 그들은 결함이있는 개념에 기반을두고있었습니다. 오늘의 첫 순간이 항상 그런 것은 아닙니다 00:00:00.000. 대신 새로운 withTimeAtStartOfDay방법을 사용하십시오 . Joda-Time의 현재 버전 2.4로 업데이트하고 릴리스 정보를 읽으십시오. 예 :DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Basil Bourque

0

하루는 24 * 60 * 60 * 1000ms 이기 때문에 오늘 자정은 다음과 같이 계산할 수 있습니다.

long now = System.currentTimeMillis();
long delta = now % 24 * 60 * 60 * 1000;
long midnight = now - delta;
Date midnightDate = new Date(midnight);`

1
이 코드는 UTC에만 적용되며 다른 시간대는 적용되지 않으며 일광 절약 시간제와 같은 예외를 무시합니다. 또한 롤업 방식의 날짜-시간 솔루션은 놀랍도록 까다로운 주제이므로 현명하지 않습니다. 대신 우수한 java.time 클래스를 사용하십시오.
Basil Bourque

0

이전 답변과 거의 비슷하지만 아무도 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);

1
귀찮은 Calendar클래스는 몇 년 전에 java.time 클래스에 의해 대체되었습니다 ZonedDateTime.
Basil Bourque

0
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);

UTC에만 적용되며 시간대를 지정하지 못합니다. 또한 끔찍한 Date수업은 몇 년 전에에 의해 대체되었습니다 java.time.Instant. Date요즘에는 사용하지 마십시오 .
Basil Bourque

0

아파치 커먼즈 사용하기

//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);

참고로, 같은 몹시 귀찮은 된 날짜 - 시간 수업 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
바질 부르 케

@BasilBourque Java 8에 동의합니다. 그러나 OP가 Java 7을 사용하는 경우 여전히 작동한다고 생각합니다.
joe4java

거의 동일한 API를 사용 하여 ThreeTen-Backport 프로젝트 에서 Java 6 및 7에 대한 거의 모든 java.time 기능을 사용할 수 있습니다 . ThreeTenABP 프로젝트 에서 Android <26에 더 적합합니다 . 따라서 비참한 오래된 날짜-시간 클래스를 다시 사용할 필요가 없습니다.
바질 부르크

-1

나는 이것이 매우 오래된 게시물이라는 것을 알고 있습니다. 나는 나의 지식을 여기에서 공유하는 것으로 생각했다!

정확한 시간대와 오늘 자정의 날짜에 다음을 사용할 수 있습니다

public static Date getCurrentDateWithMidnightTS(){

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

(1000*60 * 330)예를 들어 인도 시간대와 같이 실제로 시간대와 관련하여 빼는 곳 은 콜카타가 실제와 +5 : 30 시간과 다릅니다. 밀리 초로 변환하여 빼기.

따라서 마지막 빼기 숫자를 변경하십시오. 나는 인도를 기반으로 한 제품을 만들고 있습니다. 그래서 특정 타임 스탬프를 사용했습니다.


1
수락 된 답변 대신 왜 이것을 제안 하시겠습니까? 날짜-시간 값을 롤링하는 것은 일반적으로 위험합니다. 특히이 코드는 단일 시간대의 현재 오프셋에 영구적으로 하드 코딩됩니다. 일광 절약 시간 또는 기타 예외 사항에 대한 설명은 없습니다. 부가가치가없는 단점 만 보입니다.
Basil Bourque

물론 @Basil 나는 대답을 받아들이고 하드 코딩 된 가치에 대해 언급했다. 이것은 특정 시간대에서 작업하는 경우에만 유용합니다.
Rajeev

-1
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.Date로 또는 그 반대로 변환이 가장 간단합니까?


좋은 답변이 아닙니다 . 현대 java.time 사용과 기존 레거시 클래스 사용을 혼합하고 있습니다. 특히, java.time 클래스를 직접 처리하기 위해 드라이버가 아직 업데이트되지 않은 데이터베이스와 데이터를 교환하는 데만 사용해야하는 java.sql 날짜-시간 클래스를 사용하며 비즈니스 로직에는 사용하지 마십시오. 또 다른 문제는 시간대의 중요한 문제를 무시한다는 것입니다.
Basil Bourque

@BasilBourque, 비평 주셔서 감사합니다. 더 이상 사용되지 않는 것으로 표시되지 않은 하나의 레거시 클래스를 사용하여 다른 레거시 클래스 인스턴스를 얻는 것은 매우 안전합니다. 시간대 문제가 더 중요합니다. 나는 결국 리카르도의 대답 을 고수하기로 결정했습니다 .
Vadzim

-1

구식 ..

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

그 귀찮은 클래스는 몇 년 전에 java.time.Instant 클래스에 의해 대체되었습니다 . 사용할 필요가 없습니다 Date.
Basil Bourque

Date클래스는 항상 UTC입니다. 따라서 원하는 시간대의 문제를 무시하고 있습니다. 예를 들어, 새로운 날은 UTC보다 몇 시간 일찍, 몬트리올 퀘벡에서는 UTC보다 몇 시간 일찍 콜카타 인도에서 시작됩니다.
Basil Bourque
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.