하루의 시작 시간과 종료 시간을 얻는 방법은 무엇입니까?
하루의 시작 시간과 종료 시간을 얻는 방법은 무엇입니까?
다음과 같은 코드는 용어하지 않습니다.
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();
}
밀리 초 단위로 말하지 않습니다.
반 개방
mprivat 의 대답 이 맞습니다. 그의 요점은 하루의 끝을 얻지 않고 대신 "다음 날의 시작 전"과 비교하는 것입니다. 그의 아이디어는 "Half-Open"접근 방식으로 가능합니다. 에서 time-의 여기 범위 는 포괄적 인 시작이 있고 결말은 배타적 입니다.
- 현재 날짜-시간 프레임 워크는 Java (java.util.Date/Calendar 및 Joda-Time ) 모두 epoch 에서 밀리 초를 사용합니다 . 그러나 Java 8에서 새로운 JSR 310 java.time. * 클래스는 나노초 해상도를 사용합니다. 새 클래스로 전환하면 하루의 마지막 순간의 밀리 초 수를 강제하여 코드가 작성합니다.
- 다른 해상도를 사용하면 다른 소스의 데이터를 비교하는 데 오류가 발생합니다. 예를 들어, Unix 라이브러리는 일반적으로 전체 초를 사용하며 Postgres 와 같은 데이터베이스는 마이크로 초로 확인합니다.
- 일부 일광 절약 시간제 변경은 자정에 발생하여 상황을 혼란스럽게 할 수 있습니다.
Joda-Time 2.3은 하루의 첫 순간을 위해 바로이 목적을위한 방법을 제공합니다 . 마침 java.time에서 .withTimeAtStartOfDay()
LocalDate::atStartOfDay
더 많은 토론과 예제를 보려면 StackOverflow에서 "joda half-open" 을 검색하십시오.
Bill Schneider 의이 게시물을 참조하십시오. 시간 간격 및 기타 범위는 반쯤에 있어야합니다 .
레거시 날짜-시간 클래스 피하기
java.util.Date 및 .Calendar 클래스는 문제가있는 문제가있는 악명이 남아 있습니다. 필요한 피하십시오.
사용 중 Joda 타임 하거나, java.time . java.time 프레임 워크는 매우 성공적인 Joda-Time 라이브러리의 공식적인 제품입니다.
java.time
java.time 프레임 워크는 Java 8 이상에 빌드됩니다. 에서 자바 6 & 7 백 포팅 ThreeTen-백 포트의 추가로 안드로이드에 적응 프로젝트, ThreeTenABP의 프로젝트.
가 있는 타임 라인에 순간 UTC 의 해상도를 가진 나노초 .Instant
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.time 프레임 워크에는 Interval
Joda-Time에 대해 아래에 설명 된 클래스 가 없습니다 . 그러나 ThreeTen-Extra 프로젝트는 추가 클래스로 java.time을 확장합니다. 이 프로젝트는 java.time에 더 많은 가능성이 있습니다. 클래스 중에는 . 를 구성 하는 한 쌍의 전달하여 개체. 객체 에서 추출 할 수 있습니다 .Interval
Interval
Instant
Instant
ZonedDateTime
Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.toInstant() );
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();
자바 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();
}
getEndOfDay에서 다음을 추가 할 수 있습니다.
calendar.set(Calendar.MILLISECOND, 999);
수학적으로 말하지만 "다음 날이 시작되기 전"이라고 말하는 것 외에는 하루의 끝을 지정할 수 없습니다.
따라서라고 말하는 대신 다음과 같이 if(date >= getStartOfDay(today) && date <= getEndOfDay(today))
말해야 if(date >= getStartOfDay(today) && date < getStartOfDay(tomorrow))
합니다.. 이는 훨씬 더 확실한 정의입니다 (밀리 초 정밀도에 대해 걱정할 필요가 없습니다).
java.time
java.time
Java 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
통과하는 대신 java8 java.time.ZonedDateTime을 사용하여 하루의 시작을 찾는 추가 방법 LocalDateTime
은 단순히 입력 ZonedDateTime을 DAYS로 자르는 것 입니다.
zonedDateTimeInstance.truncatedTo( ChronoUnit.DAYS );
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)
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
누군가에게 도움이되기를 바랍니다.
이 코드를 시도해도 작동합니다!
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);
프레임 워크에 의존하지 않는 또 다른 솔루션은 다음과 달라집니다.
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 기반 시간을 반환합니다.
Java 8의 경우 OffsetDateTime (TimeZone, Nanoseconds 수신 같은 많은 이점을 제공)을 사용하는 경우 다음 코드를 사용할 수 있습니다.
OffsetDateTime reallyEndOfDay = someDay.withHour(23).withMinute(59).withSecond(59).withNano(999999999);
// output: 2019-01-10T23:59:59.999999999Z
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();
}
이 코드를 시도해도 작동합니다! :
Date d= new Date();
GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
String s_d=d.getYear()+"-"+(d.getMonth()+1)+"-"+d.getDay();
DateFormat dateFormat = DateFormat.getDateInstance();
try {
// for the end of day :
c.setTime(dateFormat.parse(s_d+" 23:59:59"));
// for the start of day:
//c.setTime(dateFormat .parse(s_d+" 00:00:00"));
} catch (ParseException e) {
e.printStackTrace();
}
참고 URL : https://stackoverflow.com/questions/10308356/how-to-obtain-the-start-time-and-end-time-of-a-day
'IT' 카테고리의 다른 글
솔루션 탐색기의 디렉터리에 이미 존재하는 디렉터리 추가 (0) | 2020.08.13 |
---|---|
JavaScript로 DIV를 표시하고 숨기는 방법 (0) | 2020.08.13 |
Git : 추가 vs 푸시 vs 커밋 (0) | 2020.08.13 |
검증되지 않은 예외 오류입니까? (0) | 2020.08.13 |
'for'루프 내부의 'for'루프가 동일한 카운터 변수 이름을 사용할 수 있습니까? (0) | 2020.08.13 |