Java 날짜 컷오프 시간 정보
날짜 및 시간 정보를 포함하는 Java Date 개체가 있습니다.시간 정보를 잘라내고 시간-분-초를 잘라 날짜만 남겨두는 방법을 쓰고 싶습니다.
입력 예:
2008-01-01 13:15:00
예상 출력:
2008-01-01 00:00:00
팁이 있나요?저는 이렇게 해보려고 했어요.
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
시간대에 문제가 생겼어요
날짜/시간 조작을 수행하는 권장 방법은 개체를 사용하는 것입니다.
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();
Apache Commons Lang에서 Date Utils 잘라내기 방법을 살펴보셨습니까?
Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);
시간 요소를 제거합니다.
Java 8 이후에 내장되어 있는 java.time 클래스에 비추어 간단히 업데이트하겠습니다.
LocalDateTime
에는 여기서 말하는 내용에 효과적으로 대응하는 방법이 있습니다.
LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)
현재 시간은 분 단위로만 표시됩니다.
2015-03-05T11:47
잘라내기 실행에는 DAYS보다 작은(또는 )을 사용할 수 있습니다(날짜 부분이 아닌 LocalDateTime 시간 부분에만 잘라내기 적용).
조다를 봤니?날짜와 시간을 사용하는 것이 훨씬 쉽고 직관적인 방법입니다.예를 들어 LocalDateTime 개체와 LocalDate 개체 간에 3가지로 변환할 수 있습니다.
예: (API를 설명하기 위해)
LocalDate date = new LocalDateTime(milliseconds).toLocalDate()
또한 날짜/시간 포메터를 사용하여 스레드 안전 문제를 해결하고 Java에서 날짜/시간 문제를 다룰 때 적극 권장됩니다.
Date date = new 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);
date = cal.getTime();
Joda라면 예정일을 쉽게 잡을 수 있습니다.
이전 2. 버전 있음)에서는2.7(-2.2)로 되어 있습니다.toDateMidnight
되었거나 적절한 이 붙여졌다.withTimeAtStartOfDay()
DateTime.now().withTimeAtStartOfDay()
가능합니다.
훨씬 더 좋은 API의 이점이 추가되었습니다.
이전 버전에서는 다음을 수행할 수 있습니다.
new DateTime(new Date()).toDateMidnight().toDate()
새로운 java8 API로 자르기 작업을 했습니다.한 가지 이상한 점을 마주했지만 일반적으로 잘려나갔죠
Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
dr;dr
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[유럽/파리]
원하는 형식으로 String을 생성하려면 를 전달합니다.
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.time 프레임워크는 Java 8 이후에 포함되어 있습니다.java.time 기능의 대부분은 Java 6 & 7 (ThreeTen-Backport)로 백포트되며 Android (ThreeTenABP)로 수정됩니다.
먼저 ISO 8601 형식의 표준 버전을 준수하도록 입력 문자열을 변경합니다.표준 ISO 8601 형식은 기본적으로 java.time 클래스에서 날짜 값을 나타내는 문자열을 구문 분석/생성하기 위해 사용됩니다.중간에 있는 SPACE를 다른 SPACE로 대체해야 합니다.T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
이제 "로 해석할 수 있습니다.여기서 "Local"은 특정 로컬을 의미하지 않습니다.입력에 UTC로부터의 오프셋 또는 시간대 정보가 없습니다.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString()… 2008-01-01T13:15:00
시간대나 타임존에 관심이 없는 경우 로 변환합니다.
LocalDate ld = ldt.toLocalDate();
ld.toString()… 2008-01-01
퍼스트 모먼트 오브 데이
대신 시각(time-of-day)을 하루 중 첫 번째 시간으로 설정하려면 클래스를 사용하여LocalDate
메서드를 호출하는 오브젝트.첫 번째 순간이 시간이 아닐 수 있다는 것을 명심하세요.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
UTC 시간대의 렌즈를 통해 그 순간을 보려면 물체를 추출합니다.둘 다ZonedDateTime
★★★★★★★★★★★★★★★★★」Instant
는 타임라인에서 같은 순간을 나타내지만 두 개의 다른 월클럭 시간으로 나타납니다.
안Instant
java java . time 정정정정 정정정 정정정 정정정정정UTC: 로직, 스토리지 및 UTC에서 이 자주 하십시오.일반적으로 비즈니스 로직, 데이터 스토리지 및 데이터 교환은 UTC에서 수행해야 하므로 이 클래스를 자주 사용하십시오.
Instant instant = zdtStartOfDay.toInstant();
instant.toString()… 2008-01-01T05:00Z
5번으로 나누다형식에서는, 「」는, 「 」, 「 」, 「 」, 「 」, 「 」Z
Zulu
UTC를 의미합니다.UTC"를 선택합니다.
java.time 정보
java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.
현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.
자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.
java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후에 준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*
②.
java.time 클래스는 어디서 얻을 수 있습니까?
- 자바 SE 8, 자바 SE 9 이후
- 붙박이.
- 번들 구현이 포함된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되어 있습니다.
- 자바 SE 6 및 자바 SE 7
- java.time 기능의 대부분은 ThreeTen 백포트의 Java 6 및7로 백포트됩니다.
- 안드로이드
- 최신 버전의 Android 번들 구현 java.time 클래스.
- 이전의 Android(<26)에서는 쓰리텐ABP 프로젝트가 ThreeTen-Backport(상기)를 채택하고 있습니다.'쓰리텐ABP 사용방법'을 참조하십시오.
쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 등 유용한 클래스가 있습니다.
Apache의 DateUtils를 다음과 같이 잘라냅니다.
DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
타임스탬프의 경우:
timestamp -= timestamp % (24 * 60 * 60 * 1000)
java.util에서.Java Docs 날짜:
클래스 날짜는 특정 순간을 밀리초의 정밀도로 나타냅니다.
및 java.sql에서 가져옵니다.Java Docs 날짜:
SQL DATE 정의를 준수하기 위해 java.sql로 둘러싸인 밀리초 값.날짜 인스턴스는 인스턴스가 연관된 특정 시간대에서 시간, 분, 초 및 밀리초를 0으로 설정하여 '표준화'해야 합니다.
따라서 가장 좋은 방법은 java.sql을 사용하는 것입니다.시간 파트가 필요하지 않은 경우 날짜
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
★★★★★★★★★★★★★★★★★.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
의 of의 LocalDateTime
예: 개요:
LocalDateTime.now().truncatedTo(ChronoUnit.DAYS)
캘린더 클래스의 사용set()
HOUR_OF_DAY, MINUTE, SECOND
★★★★★★★★★★★★★★★★★」MILLISECOND
0으로 하다
이를 통해 시간대 문제를 방지할 수 있습니다.
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 object에서 수 .
을 사용하다하지 않고 를 지정하지만 시간을 를 표시합니다.00:00:00
.
조다 타임
업데이트: Joda-Time 프로젝트는 유지보수 모드로 전환되었으며 팀은 java.time 클래스로의 이행을 권고하고 있습니다.java.time 솔루션에 대한 다른 답변을 참조하십시오.
대신 하루 중 시간을 하루 중 첫 번째 시간으로 설정하려면 Joda-Time 라이브러리의 개체를 사용하여 해당 메서드를 호출합니다.첫 번째 순간이 시간이 아닐 수 있다는 것을 명심하세요.00:00:00
서머타임이나 기타 이상현상으로 인해 발생할 수 있습니다.
새로운 "개선된" 달력 생성자가 "못된" 오래된 날짜 생성자처럼 몇 밀리초 동안 int를 사용하지 않는 것이 정말 짜증납니다.그리고 나는 매우 화가 나서 이렇게 썼다.
long stuffYou = startTime.getTimeInMillis() % 1000;
startTime.setTimeInMillis(startTime.getTimeInMillis() - stuffYou);
그 당시에는 "쓰레기"라는 단어를 사용하지 않았지만, 그 후 나는 이것의 행복을 알게 되었다.
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:00(UTC와 동일), 또는 1월1일 목요일 08:00: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) 베이징, 충칭, 홍콩, Urumq로 설정하면 다음과 같이 표시됩니다.
Thu Jan 01 08:00:00 CST 1970
Java 는 타임 스탬프를 취득해, 타임 존에 따라서 날짜와 시각 정보를 표시합니다.
Java가 다른 시간대에 날짜 및 시간 정보를 표시하는 방법을 소개하려면 시간 정보를 어떻게 변환해야 하는지 쉽게 설명합니다.타임 스탬프를 취득해, 타임 정보를 절단할 때는 타임 존을 고려할 필요가 있습니다.그런 다음 잘라낸 타임스탬프를 사용하여 새로운 날짜 객체를 생성할 수 있습니다(날짜 스탬프라고 부릅니다). Java는 날짜 정보를 표시할 때 시간대를 보상합니다.
동부 8구역(베이징 시간)과 마찬가지로 베이징 시간은 GMT보다 8시간 빠르기 때문에 모듈로 작업을 할 때는 8시간 이상을 빼야 합니다.즉, 먼저 GMT 시간을 얻은 후 PC의 시간대 설정에 따라 시간을 표시할 때 Java가 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();
}
응답이 늦어질 수 있지만 라이브러리를 사용하지 않고 한 줄에 실행할 수 있는 방법이 다음과 같습니다.
new SimpleDateFormat("yyyy-MM-dd").parse(new SimpleDateFormat("yyyy-MM-dd").format(YOUR_TIMESTAMP))
버전 2.0 이후의 Joda-Time에서는LocalDate.toDate()
.
간단하게
// someDatetime is whatever java.util.Date you have.
Date someDay = new LocalDate(someDatetime).toDate();
캘린더를 사용하는 모든 답변에 대해서는 대신 다음과 같이 사용해야 합니다.
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());
}
언급URL : https://stackoverflow.com/questions/1908387/java-date-cut-off-time-information
'programing' 카테고리의 다른 글
고유 값 카운트 (0) | 2023.01.14 |
---|---|
상위 구성 요소에서 하위 구성 요소로의 이벤트 (0) | 2023.01.14 |
1바이트에 몇 글자를 저장할 수 있습니까? (0) | 2023.01.14 |
한 번에 한 행을 추가하여 Panda 데이터 프레임 생성 (0) | 2023.01.14 |
JavaScript 링크에는 "#" 또는 "javascript:void(0)" 중 어떤 "href" 값을 사용해야 합니까? (0) | 2023.01.14 |