하루의 시작 시간과 종료 시간을 얻는 방법은 무엇입니까?


121

하루의 시작 시간과 종료 시간을 얻는 방법은 무엇입니까?

다음과 같은 코드는 정확하지 않습니다.

 private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
}

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
}

밀리 초 단위로 정확하지 않습니다.


8
"정확하지 않다"는 게 무슨 뜻입니까?
Kirk Woll 2012

코드에 어떤 문제가 있습니까? 기대하지 않은 것은 무엇입니까? 하루를 시작하고 끝낼 시간대는 무엇입니까?
Mark Reed

4
위의 코드는 메서드에 전달 된 날짜도 사용하지 않습니다. 캘린더를 만든 후 calendar.setTime (date)해야합니다.
Jerry Destremps

2
이 질문은 날짜-시간 값의 해상도가 밀리 초라고 가정합니다. java.util.Date 및 Joda-Time의 경우 참입니다. 그러나 Java 8 (나노초)의 java.time 패키지, Postgres (마이크로 초), 유닉스 라이브러리 (전체 초) 및 기타 데이터베이스와 같은 일부 데이터베이스에는 거짓입니다 . Half-Open을 사용하는 더 안전한 접근 방식에 대해서는 내 대답 을 참조하십시오 .
Basil Bourque 2014 년

2
실제로 다음 날의 시작을 가져와야하며 그날 항목을 반복 할 때 (원한다고 가정) <= 대신 <를 사용하여 상한을 지정합니다. 다음날은 제외되지만 전날은 나노초까지 모두 포함됩니다.
Daniel F

답변:


115

tl; dr

LocalDate                       // Represents an entire day, without time-of-day and without time zone.
.now(                           // Capture the current date.
    ZoneId.of( "Asia/Tokyo" )   // Returns a `ZoneId` object.
)                               // Returns a `LocalDate` object.
.atStartOfDay(                  // Determines the first moment of the day as seen on that date in that time zone. Not all days start at 00:00!
    ZoneId.of( "Asia/Tokyo" ) 
)                               // Returns a `ZonedDateTime` object.

하루의 시작

시간대로 표시되는 오늘의 전체 길이를 가져옵니다.

시작이 포괄적 인 Half-Open 접근 방식 사용 이고 끝은 배타적 입니다. 이 접근 방식은 하루의 마지막 순간을 설명하지 못하는 코드의 결함을 해결합니다.

ZoneId zoneId = ZoneId.of( "Africa/Tunis" ) ;
LocalDate today = LocalDate.now( zoneId  ) ;

ZonedDateTime zdtStart = today.atStartOfDay( zoneId ) ;
ZonedDateTime zdtStop = today.plusDays( 1 ).atStartOfDay( zoneId ) ;

zdtStart.toString () = 2020-01-30T00 : 00 + 01 : 00 [아프리카 / 튀니지]

zdtStop.toString () = 2020-01-31T00 : 00 + 01 : 00 [아프리카 / 튀니지]

UTC에서 동일한 순간을 확인하십시오.

Instant start = zdtStart.toInstant() ;
Instant stop = zdtStop.toInstant() ;

start.toString () = 2020-01-29T23 : 00 : 00Z

stop.toString () = 2020-01-30T23 : 00 : 00Z

시간대가 아닌 UTC로 표시되는 날짜의 전체 날짜를 원하면 OffsetDateTime.

LocalDate today = LocalDate.now( ZoneOffset.UTC  ) ;

OffsetDateTime odtStart = today.atTime( OffsetTime.MIN ) ;
OffsetDateTime odtStop = today.plusDays( 1 ).atTime( OffsetTime.MIN ) ;

odtStart.toString () = 2020-01-30T00 : 00 + 18 : 00

odtStop.toString () = 2020-01-31T00 : 00 + 18 : 00

이러한 OffsetDateTime 객체는 이미 UTC로되어 있지만 toInstant정의상 항상 UTC로되어있는 객체가 필요한 경우 호출 할 수 있습니다 .

Instant start = odtStart.toInstant() ;
Instant stop = odtStop.toInstant() ;

start.toString () = 2020-01-29T06 : 00 : 00Z

stop.toString () = 2020-01-30T06 : 00 : 00Z

팁 : 프로젝트에 ThreeTen-Extra 라이브러리를 추가 하여 해당 Interval클래스를 사용 하여이 Instant개체 쌍을 나타내는 데 관심이있을 수 있습니다 . 같은 비교를 위해이 클래스 이벤트 유용한 방법 abuts, overlaps, contains, 등.

Interval interval = Interval.of( start , stop ) ;

interval.toString () = 2020-01-29T06 : 00 : 00Z / 2020-01-30T06 : 00 : 00Z

반 개방

mprivat대답 이 맞습니다. 그의 요점은 하루의 끝을 얻으려고하지 않고 오히려 "다음 날의 시작 전"과 비교하는 것입니다. 그의 아이디어는 "Half-Open"접근 방식으로 알려져 있습니다. 여기서 시간의 범위 는 포괄적 인 시작이 있고 결말은 배타적 입니다.

  • Java의 현재 날짜-시간 프레임 워크 (java.util.Date/Calendar 및 Joda-Time )는 둘 다 시대의 . 그러나 Java 8에서 새로운 JSR 310 java.time. * 클래스는 나노초 해상도를 사용합니다. 새 클래스로 전환하면 하루의 마지막 순간의 밀리 초 수를 강제하여 작성한 코드가 올바르지 않습니다.
  • 다른 해상도를 사용하면 다른 소스의 데이터를 비교하는 데 오류가 발생합니다. 예를 들어, Unix 라이브러리는 일반적으로 전체 초를 사용하고 Postgres 와 같은 데이터베이스 날짜-시간을 마이크로 초로 확인합니다.
  • 일부 일광 절약 시간제 변경은 자정에 발생하여 상황을 더욱 혼란스럽게 할 수 있습니다.

여기에 이미지 설명 입력

Joda-Time 2.3은 하루의 첫 순간을 얻기 위해 바로이 목적을위한 방법을 제공합니다 withTimeAtStartOfDay(). 마찬가지로 java.time에서 LocalDate::atStartOfDay.

StackOverflow에서 "joda half-open"검색더 많은 토론과 예제를 보려면 을 검색하십시오.

이 게시물을 참조하십시오. 시간 간격 및 기타 범위는 반쯤 열려 있어야합니다.Bill Schneider .

레거시 날짜-시간 클래스 피하기

java.util.Date 및 .Calendar 클래스는 문제가있는 것으로 악명이 높습니다. 그들을 피하십시오.

java.time 클래스를 사용하십시오 . java.time의 프레임 워크는 매우 성공적인의 공식 후계자 Joda 타임 라이브러리입니다.

java.time

java.time 프레임 워크는 Java 8 이상에 빌드됩니다. ThreeTen-Backport 프로젝트 에서 Java 6 및 7로 백 포팅되고 ThreeTenABP 에서 Android에 추가로 적용됨 프로젝트.

Instant있는 타임 라인에 순간 UTC 의 해상도를 가진 나노초 .

Instant instant = Instant.now();

일부 지역의 벽시계 시간 을 얻으려면 시간대를 적용하십시오 .

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

하루의 첫 순간을 얻으려면 LocalDate수업과 그 atStartOfDay방법을 살펴보십시오 .

ZonedDateTime zdtStart = zdt.toLocalDate().atStartOfDay( zoneId );

Half-Open 접근 방식을 사용하여 다음 날의 첫 순간을 얻습니다.

ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

최신 및 레거시 모두 Java의 모든 날짜-시간 유형 표

현재 java.time 프레임 워크에는 IntervalJoda-Time에 대해 아래에 설명 된 클래스 가 없습니다 . 그러나 ThreeTen-Extra 프로젝트는 추가 클래스로 java.time을 확장합니다. 이 프로젝트는 java.time에 향후 추가 될 수있는 가능성을 입증하는 기반입니다. 클래스 중에는 Interval. 를 구성 Interval하는 한 쌍의 전달하여 Instant개체. 객체 Instant에서 를 추출 할 수 있습니다 ZonedDateTime.

Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.toInstant() );

java.time 정보

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

자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310입니다. 입니다.

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

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 . Hibernate 5 및 JPA 2.2는 java.time을 지원 합니다 .java.sql.*

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


Joda-Time

업데이트 : Joda-Time 프로젝트는 현재 유지 관리 모드에 있으며 java.time 클래스 로의 마이그레이션을 권장 합니다. 이 섹션은 역사를 위해 그대로 두겠습니다.

Joda 타임은 다양한 방법으로 시간의 범위를 나타내는 세 개의 클래스가 있습니다 Interval, Period하고 Duration. An Interval은 우주의 타임 라인에 특정한 시작과 끝이 있습니다. 이것은 "하루"를 표현해야하는 우리의 필요에 부합합니다.

withTimeAtStartOfDay시간을 0으로 설정 하는 대신 메서드를 호출합니다 . 일광 절약 시간 및 기타 예외 사항으로 인해 하루 중 첫 순간이 아닐 수 있습니다 00:00:00.

Joda-Time 2.3을 사용한 예제 코드.

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime now = DateTime.now( timeZone );
DateTime todayStart = now.withTimeAtStartOfDay();
DateTime tomorrowStart = now.plusDays( 1 ).withTimeAtStartOfDay();
Interval today = new Interval( todayStart, tomorrowStart );

필요한 경우 java.util.Date로 변환 할 수 있습니다.

java.util.Date date = todayStart.toDate();

나는 사용해야한다LocalDateTime
user924

170

자바 8


public static Date atStartOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);
    return localDateTimeToDate(startOfDay);
}

public static Date atEndOfDay(Date date) {
    LocalDateTime localDateTime = dateToLocalDateTime(date);
    LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
    return localDateTimeToDate(endOfDay);
}

private static LocalDateTime dateToLocalDateTime(Date date) {
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
}

private static Date localDateTimeToDate(LocalDateTime localDateTime) {
    return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}

업데이트 : 여기에서 Java 유틸리티 클래스에이 두 가지 메서드를 추가 했습니다.

다음 위치의 Maven 중앙 저장소에 있습니다.

<dependency>
  <groupId>com.github.rkumsher</groupId>
  <artifactId>utils</artifactId>
  <version>1.3</version>
</dependency>

Java 7 이하


Apache Commons 사용

public static Date atEndOfDay(Date date) {
    return DateUtils.addMilliseconds(DateUtils.ceiling(date, Calendar.DATE), -1);
}

public static Date atStartOfDay(Date date) {
    return DateUtils.truncate(date, Calendar.DATE);
}

Apache Commons없이

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

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

5
Joda와 같은 시간 라이브러리가 처리 할 시간대, 일광 절약 등의 문제가 발생하기 때문에이 방법을 사용하지 않는 것이 좋습니다.
Edward Anderson

7
내가 생각 getStartOfDay해야합니다 : LocalDateTime startOfDay = localDateTime.with(LocalTime.MIN);즉 LocalDateTime이 아닌 LocalTime입니다.
Konstantin Kulagin

그런 생각하지 마십시오 getEndOfDay(Date date). getStartOfDay(Date date)Java 8 섹션의 메소드가 정확합니다. 즉, LocalDateTime.MAX 및 .MIN은 하루의 시작과 끝이 아닌 과거와 미래의 가능한 가장 빠른 날짜를 설정합니다 . 대신 시작에는 .atStartOfDay ()를, 끝에는 .plusDays (1) .atStartOfDay (). minusNanos (1)를 제안합니다.
Glen Mazza

메소드에서 localDateTimeToDate(LocalDateTime startOfDay)예외 발생
-java.lang.IllegalArgumentException

1
@GlenMazza 자바 (8) 솔루션을 사용하여 로컬 시간 .MAX 하지 LocalDateTime.MAX는 . 해결책이 맞습니다.
Frederico Pantuzza

28

getEndOfDay에서 다음을 추가 할 수 있습니다.

calendar.set(Calendar.MILLISECOND, 999);

수학적으로 말하면 "다음 날이 시작되기 전"이라고 말하는 것 외에는 하루의 끝을 지정할 수 없습니다.

그래서 말하는 대신 if(date >= getStartOfDay(today) && date <= getEndOfDay(today)) 말해야 if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow))합니다.. 이는 훨씬 더 확실한 정의입니다 (밀리 초 정밀도에 대해 걱정할 필요가 없습니다).


1
이 답변의 후반부가 가장 좋은 방법입니다. 이 접근 방식을 "반 개방"이라고합니다. 나는 내 대답 에서 더 자세히 설명 합니다.
바질 우르 큐

14

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
// end of a day
now.with(LocalTime.MAX); // 2015-11-19T23:59:59.999999999

3
이 답변은 일광 절약 시간 (DST)과 같은 예외 사항을 무시합니다. Local…클래스는 시간 영역의 개념과 이상에 대한 조정이 없습니다. 예를 들어, 일부 시간대에는 자정에 DST 변경이 있으므로 하루의 첫 번째 순간은 이 코드로 생성 된 값이 01:00:00.0아닌 시간 (오전 1시) 00:00:00.0입니다. ZonedDateTime대신 사용하십시오 .
Basil Bourque

4

통과하는 대신 java8 java.time.ZonedDateTime으로 하루의 시작을 찾는 추가 방법 LocalDateTime은 단순히 입력 ZonedDateTime을 DAYS로 자르는 것 입니다.

zonedDateTimeInstance.truncatedTo( ChronoUnit.DAYS );

2

Java 8의 경우 다음 한 줄 문이 작동합니다. 이 예에서는 UTC 시간대를 사용합니다. 현재 사용하고있는 시간대를 변경해보십시오.

System.out.println(new Date());

final LocalDateTime endOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
final Date          endOfDayAsDate = Date.from(endOfDay.toInstant(ZoneOffset.UTC));

System.out.println(endOfDayAsDate);

final LocalDateTime startOfDay       = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
final Date          startOfDayAsDate = Date.from(startOfDay.toInstant(ZoneOffset.UTC));

System.out.println(startOfDayAsDate);

출력과 시차가없는 경우. 시험:ZoneOffset.ofHours(0)


1
이것이 기존 답변보다 가치를 어떻게 추가합니까? 또한 시간대의 중요한 문제를 무시합니다. 그리고 UTC 상수를에 전달하는 toInstant것은 잘못된 구문이며 개념적으로 중복됩니다.
Basil Bourque

@BasilBourque "이것이 기존 답변보다 가치를 어떻게 추가합니까?" 이것이 stackoverflow가 작동하는 방식입니다. BTW 이것은 단지 템플릿입니다. 사람들은 자신이 원하는 방식으로 바꿀 수 있습니다. UTC를 toInstant에 전달하는 것은 완전히 합법적입니다. 출력을 검토 할 수 있습니다.
Fırat KÜÇÜK

2

Java 8 또는 ThreeTenABP

ZonedDateTime

ZonedDateTime curDate = ZonedDateTime.now();

public ZonedDateTime startOfDay() {
    return curDate
    .toLocalDate()
    .atStartOfDay()
    .atZone(curDate.getZone())
    .withEarlierOffsetAtOverlap();
}

public ZonedDateTime endOfDay() {

    ZonedDateTime startOfTomorrow =
        curDate
        .toLocalDate()
        .plusDays(1)
        .atStartOfDay()
        .atZone(curDate.getZone())
        .withEarlierOffsetAtOverlap();

    return startOfTomorrow.minusSeconds(1);
}

// based on https://stackoverflow.com/a/29145886/1658268

LocalDateTime

LocalDateTime curDate = LocalDateTime.now();

public LocalDateTime startOfDay() {
    return curDate.atStartOfDay();
}

public LocalDateTime endOfDay() {
    return startOfTomorrow.atTime(LocalTime.MAX);  //23:59:59.999999999;
}

// based on https://stackoverflow.com/a/36408726/1658268

누군가에게 도움이되기를 바랍니다.


"atTime"메서드는 하루의 끝을 위해 상수 "LocalTime.MAX"를 사용하는 매우 좋은 방법입니다. 좋은!
Mr. Anderson

2

이 코드를 시도했는데 잘 작동합니다!

final ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
final ZonedDateTime startofDay =
    now.toLocalDate().atStartOfDay(ZoneOffset.UTC);
final ZonedDateTime endOfDay =
    now.toLocalDate().atTime(LocalTime.MAX).atZone(ZoneOffset.UTC);

당신이 가지고 ZonedDateTime있고 Instant당신의 처분에 따라 사용할 필요가 없습니다 java.sql.Timestamp. 이 클래스는 현재 java.time 클래스로 대체 된 끔찍한 오래된 레거시 클래스 중 하나입니다 . JDBC 4.2 부터는 java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . 당신의 유산과 현대 수업의 혼합은 나에게 의미가 없습니다.
Basil Bourque

1

프레임 워크에 의존하지 않는 또 다른 솔루션은 다음과 같습니다.

static public Date getStartOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date(day.getTime() / oneDayInMillis * oneDayInMillis);
}

static public Date getEndOfADay(Date day) {
    final long oneDayInMillis = 24 * 60 * 60 * 1000;
    return new Date((day.getTime() / oneDayInMillis + 1) * oneDayInMillis - 1);
}

UTC 기반 시간을 반환합니다.


1
private Date getStartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 0, 0, 0);
    return calendar.getTime();
    }

private Date getEndOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH);
    int day = calendar.get(Calendar.DATE);
    calendar.setTimeInMillis(0);
    calendar.set(year, month, day, 23, 59, 59);
    return calendar.getTime();
    }

calendar.setTimeInMillis (0); 최대 밀리 초의 정확도 제공


1
이 끔찍한 날짜-시간 클래스는 몇 년 전에 JSR 310에 정의 된 최신 java.time 클래스로 대체되었습니다.
Basil Bourque

@BasilBourque 패키지 java.time 은 Android N (API 26) 이후에만 사용할 수있는 Java 8에만 나타났습니다
ivan8m8

@ ivan8m8 대부분의 java.time 기능은 ThreeTen-Backport 라이브러리 의 Java 6 및 7로 백 포트됩니다 . ThreeTenABP 라이브러리의 초기 Android (<26)에 더 적합 합니다.
Basil Bourque

@BasilBourque 그러나 ThreeTen은 Android에서 매우 비효율적 인 메커니즘을 사용 합니다 .
ivan8m8

@ 당신의 전신 인 생각 될 수있다 ivan8m8 java.time , Joda 타임 . 다시 ThreeTenABP 프로젝트를 참조하십시오 . 해당 라이브러리를 사용하는 Android에서 이러한 비 효율성에 대해 들어 본 적이 없습니다.
Basil Bourque

0

조금 늦었다는 것을 알고 있지만 Java 8의 경우 OffsetDateTime (TimeZone, Nanoseconds 등과 같은 많은 이점을 제공)을 사용하는 경우 다음 코드를 사용할 수 있습니다.

OffsetDateTime reallyEndOfDay = someDay.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
// output: 2019-01-10T23:59:59.999999999Z

0

Instant 변수 의 유형이 필요했고 시간대가 항상 모든 것을 변경하는 데 방해가 되었기 때문에 모든 솔루션에 몇 가지 불편을 겪었습니다. 솔루션 을 결합하면 이것이 좋은 옵션이라는 것을 알았습니다.

        LocalDate today = LocalDate.now();
        Instant startDate = Instant.parse(today.toString()+"T00:00:00Z");
        Instant endDate = Instant.parse(today.toString()+"T23:59:59Z");

결과적으로

        startDate = 2020-01-30T00:00:00Z
        endDate = 2020-01-30T23:59:59Z

도움이 되길 바랍니다


하루는 실제로 다음 날 의 첫 순간이 오면 끝납니다 . 귀하의 코드는 하루의 마지막 1 초 (보고되지 않은 10 억 나노초)를 건너 뜁니다. 시간 범위 정의에 대한 Half-Open 접근 방식에 대해 알아 보려면 내 답변 을 참조하십시오 .
Basil Bourque

날짜-시간 값을 처리하는 방법으로 문자열을 조작하는 것은 일반적으로 좋지 않은 접근 방식입니다. 이 작업에는 멍청한 문자열 대신 스마트 개체를 사용하십시오. java.time의 클래스를 사용하면 문자열 조작에 의존하지 않고이 문제에 필요한 모든 기능을 제공합니다.
Basil Bourque

나는 이제 한 쌍의 객체 로 하루의 범위를 얻는 방법을 보여주는 내 답변에 tl; dr 섹션을 추가했습니다 . 팁 : 클래스 를 사용하기 위해 ThreeTen-Extra 라이브러리를 프로젝트 에 추가하는 관심이있을 수 있습니다 . InstantInterval
Basil Bourque

0

가장 쉬운 방법은 다음과 같습니다.

// Joda Time

DateTime dateTime=new DateTime(); 

StartOfDayMillis = dateTime.withMillis(System.currentTimeMillis()).withTimeAtStartOfDay().getMillis();
EndOfDayMillis = dateTime.withMillis(StartOfDayMillis).plusDays(1).minusSeconds(1).getMillis();

이 밀리 초는 Joda Time의 요구 사항에 따라 Calendar, Instant 또는 LocalDate로 변환 할 수 있습니다.


-2
public static Date beginOfDay(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    return cal.getTime();
}

public static Date endOfDay(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.HOUR_OF_DAY, 23);
    cal.set(Calendar.MINUTE, 59);
    cal.set(Calendar.SECOND, 59);
    cal.set(Calendar.MILLISECOND, 999);

    return cal.getTime();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.