답변:
추천 날짜 / 시간 조작을 할 수있는 방법은 사용하는 Calendar
개체를 :
Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
java.util.Calendar
지금 기존 에 의해 대체, java.time의 클래스. Oracle의 Tutorial을 참조하십시오 .
Apache Commons Lang에서 DateUtils truncate 메소드를 보셨습니까 ?
Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);
시간 요소를 제거합니다.
Joda를 보셨습니까 ? 날짜와 시간으로 작업 하는 훨씬 쉽고 직관적 인 방법입니다. 예를 들어 LocalDateTime 과 LocalDate 객체 사이에서 사소하게 변환 할 수 있습니다 .
예 (API를 설명하기 위해)
LocalDate date = new LocalDateTime(milliseconds).toLocalDate()
또한 날짜 / 시간 포맷터의 일부 스레드 안전성 문제를 해결하며 Java의 모든 날짜 / 시간 문제에 대해 작업 할 때 강력히 권장됩니다.
이제 Java 8 이상에 내장 된 java.time 클래스 에 비추어 간단한 업데이트입니다 .
LocalDateTime
truncatedTo
여기서 말하는 내용을 효과적으로 해결 하는 방법이 있습니다.
LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)
이것은 현재 시간을 분 단위로만 표현합니다.
2015-03-05T11:47
자르기를 실행하기 위해 DAYS보다 작은 ChronoUnit
(또는 TemporalUnit
)을 사용할 수 있습니다 ( 잘림은 날짜 부분이 아닌 LocalDateTime의 시간 부분에만 적용되므로).
Joda를 사용하면 예상 날짜를 쉽게 얻을 수 있습니다.
버전 2.7부터 (아마도 2.2보다 큰 이전 버전 이후 일 수 있음), 주석가가 언급했듯이 toDateMidnight
더 이상 사용되지 않거나 적절하게 이름이 지정 withTimeAtStartOfDay()
되어 편리합니다.
DateTime.now().withTimeAtStartOfDay()
가능한.
더 좋은 API의 이점이 추가되었습니다.
이전 버전에서는 다음을 수행 할 수 있습니다.
new DateTime(new Date()).toDateMidnight().toDate()
withTimeAtStartOfDay
.
toLocalDate
시간 구성 요소도없는 객체를 가져 오는 데 사용할 수도 있습니다 .
새로운 java8 API로 잘림을 수행했습니다. 나는 이상한 일에 직면했지만 일반적으로 잘립니다 ...
Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
Apache의 DateUtils를 다음과 같이 자르기와 함께 사용하십시오.
DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
타임 스탬프 :
timestamp -= timestamp % (24 * 60 * 60 * 1000)
java.util.Date JavaDocs에서 :
Date 클래스는 밀리 초 정밀도로 특정 순간을 나타냅니다.
그리고 java.sql.Date JavaDocs에서 :
SQL DATE의 정의를 따르려면 인스턴스가 연결된 특정 시간대에서 시간, 분, 초 및 밀리 초를 0으로 설정하여 java.sql.Date 인스턴스로 래핑 된 밀리 초 값을 '정규화'해야합니다. .
따라서 가장 좋은 방법은 시간 부분이 필요하지 않은 경우 java.sql.Date를 사용하는 것입니다.
java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());
출력은 다음과 같습니다.
java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date : 2012-04-26
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00 : 00 + 01 : 00 [유럽 / 파리]
원하는 형식으로 문자열을 생성하려면 DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
다른 답변은 정확하지만 이제 java.time 프레임 워크에 의해 구식 된 이전 날짜 시간 클래스를 사용하십시오.
java.time 프레임 워크는 Java 8 이상에 빌드됩니다. java.time 기능의 대부분은 Java 6 및 7 ( ThreeTen-Backport ) 로 백 포팅 되고 Android ( ThreeTenABP )에 추가로 적용됩니다 .
먼저 ISO 8601 형식의 표준 버전을 준수하도록 입력 문자열을 변경합니다. 표준 ISO 8601 형식은 날짜-시간 값을 나타내는 문자열을 구문 분석 / 생성하기 위해 java.time 클래스에서 기본적으로 사용됩니다. 중간에있는 SPACE를 T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
이제 LocalDateTime
"Local"은 특정 지역이 없음을 의미 하는으로 구문 분석 할 수 있습니다. 입력에 UTC 또는 시간대 정보 로부터의 오프셋 이 없습니다 .
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13 : 15 : 00
시간이나 시간대에 신경 쓰지 않는다면 LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
대신 시간을 하루의 첫 번째 순간으로 설정하려면 ZonedDateTime
클래스를 사용한 다음 LocalDate
객체 로 변환하여 해당 atStartOfDay
메서드 를 호출하십시오 . 첫 번째 순간은 00:00:00
일광 절약 시간 또는 기타 예외로 인해 시간이 아닐 수 있습니다 .
시간대는 특정 순간에 날짜가 전 세계적으로 지역별로 다르기 때문에 중요합니다. 예를 들어, 파리의 자정 이후 몇 분이 파리 인에게는 새로운 날이지만 캐나다인에게는 몬트리올에서는 여전히 "어제"입니다.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00 : 00 : 00-05 : 00 [미국 / 몬트리올]
UTC 시간대 의 렌즈를 통해 그 순간을 보려면 Instant
객체를 추출하십시오 . ZonedDateTime
및 둘 다 Instant
타임 라인에서 동일한 순간을 나타내지 만 두 개의 다른 벽시계 시간 으로 나타납니다 .
An Instant
은 java.time의 기본 빌딩 블록 클래스이며 정의에 따라 항상 UTC로 표시됩니다. 일반적으로 비즈니스 로직, 데이터 저장 및 데이터 교환을 UTC로 수행해야하므로이 클래스를 자주 사용하십시오.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05 : 00 : 00Z
자정이 아닌 오전 5 시가 보입니다. 표준 형식 Z
에서 끝은 Zulu
"UTC"를 의미합니다.
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date
, Calendar
, SimpleDateFormat
.
Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오. 사양은 JSR 310 입니다.
java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이나 클래스 가 필요하지 않습니다 .java.sql.*
java.time 클래스는 어디서 구할 수 있습니까?
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 할 수있는 가능성을 입증하는 곳입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval
, YearWeek
, YearQuarter
, 그리고 더 .
문제는 모순적입니다. 시간이없는 날짜를 요청하지만 시간이있는 예를 표시합니다 00:00:00
.
UPDATE : Joda 타임 프로젝트에 지금 유지 관리 모드 받는 마이그레이션을 조언 팀과 함께, java.time의 클래스. java.time 솔루션에 대한 다른 답변 을 참조하십시오 .
대신 시간을 하루의 첫 번째 순간으로 설정 DateTime
하려면 Joda-Time 라이브러리 의 개체를 사용하고 해당 withTimeAtStartOfDay
메서드를 호출하십시오 . 첫 번째 순간은 00:00:00
일광 절약 시간 또는 기타 예외로 인해 시간이 아닐 수 있습니다 .
그냥 clear()
중복 필드.
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.MINUTE);
calendar.clear(Calendar.SECOND);
calendar.clear(Calendar.MILLISECOND);
Date truncatedDate = calendar.getTime();
Java 8에서 더 나은 옵션은 다음과 같은 truncatedTo
메소드 를 사용 하는 것입니다 LocalDateTime
.
LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
calendar.clear(Calendar.HOUR_OF_DAY);
시간이 명확하지 않기 때문 입니다. @cletus의 솔루션은 정상적으로 작동합니다.
새로운 "개선 된"달력 생성자가 "끔찍한"오래된 날짜처럼 밀리 초 동안 int를 사용하지 않는다는 사실이 정말 짜증났습니다. 나는 정말로 십자가를 가지고 이것을 썼다.
long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);
나는 그 당시에 "stuff"라는 단어를 사용하지 않았는데, 그때 나는 이것의 행복을 발견했습니다.
startTime.set(Calendar.MILLISECOND, 0);
그러나 나는 여전히 그것에 대해 상당히 교차합니다.
다음과 같은 문제를 해결했습니다 (동쪽 8 개 지역 (북경 시간)).
private Date getTruncatedDate(Date d) {
if (d == null) {
return null;
}
long h = 60 * 60 * 1000L;
long dateStamp = d.getTime() - (d.getTime() + 8 * h) % (24 * h);
return new Date(dateStamp);
}
먼저 타임 스탬프가 무엇인지 명확히해야합니다. 타임 스탬프는 GMT 1970 년 1 월 1 일 00:00:00 (UTC와 동일) 또는 Thu Jan 01 08:00:00 CST 1970에서 현재까지의 총 밀리 초입니다.
기억하세요 : 타임 스탬프는 시간대와 무관합니다.
따라서 다른 시간대에서 다음 문으로 동일한 결과를 얻습니다.
System.out.println(new Date().getTime());
과
System.out.println(new Date(0));
다른 시간대의 다른 시간 정보를 인쇄합니다. PC 시간대를 UTC로 설정하면
Thu Jan 01 00:00:00 UTC 1970
그러나 시간대를 (UTC +8 : 00) Beijing, Chongqing, HongKong, Urumq로 설정하면 다음을 얻을 수 있습니다.
Thu Jan 01 08:00:00 CST 1970
Java는 타임 스탬프를받은 다음 시간대에 따라 날짜 및 시간 정보를 표시합니다.
Java가 다른 시간대에서 날짜 및 시간 정보를 표시하는 방법을 소개하려면 시간 정보를 변환하는 방법이 쉽습니다. 타임 스탬프를 확인하고 시간 정보를자를 때 시간대를 고려해야합니다. 그런 다음 잘라낸 타임 스탬프 (날짜 스탬프라고 부를 수 있음)를 사용하여 새 Date 객체를 만들 수 있으며 Java는 날짜 정보를 표시 할 때 시간대를 보정합니다.
동부 8 개 지역 (북경 시간)과 마찬가지로 베이징 시간은 GMT보다 8 시간 빠르므로 모듈로 작업을 수행 할 때 8 시간을 더 빼야합니다. 즉, 먼저 GMT 시간을 얻어야합니다. 그러면 Java는 PC의 시간대 설정에 따라 시간을 표시 할 때 8 시간을 추가합니다.
시간대 문제는 모호하며 오랫동안 저를 당혹스럽게합니다. 이제 명확하게합니다. 희망이 도움이됩니다.
2018-01-04 아래 방법도 작동합니다.
private Date getTruncatedDate2(Date d) {
Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(d);
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 truncDate(Date date) {
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
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();
}
Java Date
객체는 타임 스탬프 값이지만 자르는 동안 현지 시간대로 변환되므로 UTC 시간대에서 값을 예상하면 놀라운 값을 얻을 수 있습니다.
Calendar
및 Date
클래스는 레거시 년 전되었다 java.time의 나중에 자바 8에서 JSR 310를 구현하는 클래스. 2018 년 사용을 제안하는 것은 좋지 않은 조언입니다.
함께 Joda 타임 버전 2.0 이후 사용할 수 있습니다 LocalDate.toDate()
.
간단히
// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
a Java Date object
내가 사용하여 java.util.Date
. 더욱이 Date
.
캘린더를 사용하는 모든 답변에 대해 대신 다음과 같이 사용해야합니다.
public static Date truncateDate(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, c.getActualMinimum(Calendar.HOUR_OF_DAY));
c.set(Calendar.MINUTE, c.getActualMinimum(Calendar.MINUTE));
c.set(Calendar.SECOND, c.getActualMinimum(Calendar.SECOND));
c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
return c.getTime();
}
하지만 나는 이것을 선호합니다 :
public static Date truncateDate(Date date) {
return new java.sql.Date(date.getTime());
}
java.sql.Date
클래스는 날짜 전용 값을 표현하는 척하지만 실제로는 시간의 일 UTC 시간대 조정을 가지고있다. 따라서 질문에 대한 적절한 해결책이 아닙니다.
다음은 Java 8 이상을 사용하는 경우 시간없이 날짜를 가져 오는 간단한 방법 입니다. 날짜 대신 java.time.LocalDate 유형을 사용하십시오 .
LocalDate now = LocalDate.now();
System.out.println(now.toString());
출력 :
2019-05-30
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
LocalDate
은 대부분의 목적에서 좋은 생각이지만 이것이 질문의 입력으로 어떻게 작동하는지 확실하지 않습니다 2008-01-01 13:15:00
.