2개의 java.util을 비교합니다.같은 날인지 확인하는 날짜
개를 가 있다Date
s)date1
★★★★★★★★★★★★★★★★★」date2
해서 ' )을 생각해 boolean sameDay
두 Date
는 같은 날을 공유합니다.거짓
이거 어떻게 해?여기 혼란의 소용돌이가 있는 것 같습니다...가능하면 JDK 이외의 의존관계를 끌어들이는 것은 피하고 싶습니다.
명확히 하기 위해:date1
★★★★★★★★★★★★★★★★★」date2
sameDay
사실이거나, 그렇지 않으면 거짓입니다.「 」 「 」 、 「 」 。시간대를 지나면 좋겠지만 GMT나 현지시간 중 어느 쪽이든 동작만 알면 살 수 있어요.
다시 한 번 설명하겠습니다.
date1 = 2008 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = true
date1 = 2009 Jun 03 12:56:03
date2 = 2008 Jun 03 12:59:44
=> sameDate = false
date1 = 2008 Aug 03 12:00:00
date2 = 2008 Jun 03 12:00:00
=> sameDate = false
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR) &&
cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR);
서로 다른 시간대가 관련될 수 있을 때 "같은 날"은 들리는 것처럼 단순한 개념이 아닙니다.위의 코드는 두 날짜에 대해 실행 중인 컴퓨터에서 사용되는 시간대를 기준으로 날짜를 계산합니다. 없는 타임 을 「」에 필요가 .Calendar.getInstance()
"같은 날"이 정확히 무엇을 의미하는지 결정한 후 호출합니다.
네,,, 다, 다 and and and andLocalDate
모든 것을 훨씬 깨끗하고 쉽게 만들 수 있습니다(비록 시간대와 관련된 동일한 어려움이 존재하지만).
그럼 어떻게 해?
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
return fmt.format(date1).equals(fmt.format(date2));
필요한 경우 시간대를 SimpleDateFormat으로 설정할 수도 있습니다.
이를 위해 "apache commons lang" 패키지(org.apache.commons.lang.time)를 사용합니다.Date Utils)
boolean samedate = DateUtils.isSameDay(date1, date2); //Takes either Calendar or Date objects
각 날짜에 대한 줄리안 일 수를 계산한 후 이들을 비교하여 달력을 사용하는 외부 종속성 및 성능 저하를 방지할 수 있습니다.
public static boolean isSameDay(Date date1, Date date2) {
// Strip out the time part of each date.
long julianDayNumber1 = date1.getTime() / MILLIS_PER_DAY;
long julianDayNumber2 = date2.getTime() / MILLIS_PER_DAY;
// If they now are equal then it is the same day.
return julianDayNumber1 == julianDayNumber2;
}
조다 타임
의존관계 추가에 대해서는 java.util이 유감입니다.Date & . Calendar가 너무 나빠서 새로운 프로젝트에서 가장 먼저 해야 할 일은 Joda-Time 라이브러리를 추가하는 것입니다.Java 8에서는 Joda-Time에서 영감을 얻은 새로운 java.time 패키지를 사용할 수 있습니다.
Joda-Time의 핵심은 수업이다.java.util과는 다르게.날짜, 할당된 표준 DateTimeZone
시간대를 이해합니다().j.u에서 변환할 때.날짜, 영역을 할당합니다.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
같은 날짜에 두 개의 날짜 시각이 도착하는지 확인하는 한 가지 방법은 객체로 변환하는 것입니다.
이 변환은 할당된 시간대에 따라 달라집니다.LocalDate
오브젝트는 같은 존으로 변환되어야 합니다.
여기 간단한 유틸리티 방법이 있습니다.
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
첫 번째 DateTime 객체의 시간대를 사용하는 것이 아니라 시간대를 지정하는 것이 좋습니다.
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
문자열 표현
또 다른 접근법은 각 날짜의 날짜 부분을 문자열로 표현한 후 문자열을 비교하는 것입니다.
다시 한 번 할당된 시간대가 중요합니다.
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
시간 범위
일반화 솔루션은 시간 범위를 정의한 다음 해당 범위에 대상이 포함되어 있는지 확인하는 것입니다.Joda-Time 2.4입니다.는 "midnight"로. '어울리다'를 하세요.withTimeAtStartOfDay
은 으로 표현합니다.Joda-Time은 다양한 방식으로 시간 범위를 나타내는 세 가지 클래스를 제공합니다.아, 아, 아, 아, 아, 아, 아, 아, 아.
스팬의 시작이 포함되고 끝이 제외되는 "Half-Open" 접근 방식을 사용합니다.
타겟의 타임존은 인터벌의 타임존과 다를 수 있습니다.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
java.time
Java 8 이후에는 java.time 프레임워크가 포함되어 있습니다.JSR 310에서 정의되고 ThreeTen-Extra 프로젝트에서 확장된 Joda-Time에서 영감을 받았습니다.튜토리얼을 참조해 주세요.
Joda-Time의 메이커로부터, 가능한 한 빨리 java.time으로 이행하도록 지시받았습니다.그 사이 Joda-Time은 적극적으로 유지 보수된 프로젝트로 계속됩니다.그러나 향후 작업은 Joda-Time이 아닌 java.time과 ThreeTen-Extra에서만 수행될 것으로 예상됩니다.
하면...java.time은...Instant
UTC의 입니다.합니다(「」).ZoneId
ZonedDateTime
, , 로컬클래스 「로컬 클래스: 「로컬」클래스는 「로컬」입니다.LocalDateTime
,LocalDate
,LocalTime
이 답변의 Joda-Time 섹션에서 설명하는 논리는 java.time에 적용됩니다.
오래된 java.util.날짜 클래스에는 java.time으로 변환하는 새로운 메서드가 있습니다.
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
날짜를 결정하려면 표준 시간대가 필요합니다.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
를 " " 에 합니다.Instant
을 ZonedDateTime
기 、 기 、 기 、 ( 、 ( 、 ( 、 ( ( ( a ) 。LocalDate
날짜(시간, 분 등이 아닌)를 비교하는 것이 목표이기 때문입니다.
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
번째 1번도 .java.util.Date
비교를 위해 필요한 객체입니다.대신 지금 이 순간을 이용하겠습니다.
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
특별한 방법을 사용하여 동일한 날짜 값을 테스트합니다.
Boolean sameDate = localDate1.isEqual( localDate2 );
날짜를 Java 8 java.time으로 변환합니다.여기에 표시된 LocalDate.
LocalDate localDate1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localDate2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// compare dates
assertTrue("Not on the same day", localDate1.equals(localDate2));
자바 8
프로젝트에서 Java 8을 사용하여java.sql.Timestamp
, 를 사용할 수 있습니다.LocalDate
클래스:
sameDate = date1.toLocalDateTime().toLocalDate().equals(date2.toLocalDateTime().toLocalDate());
사용하시는 경우java.util.Date
덜 애매한 Istvan의 답변을 보세요.
Android 사용자:
사용할 수 있습니다.DateUtils.isToday(dateMilliseconds)
지정된 날짜가 현재 날짜인지 여부를 확인합니다.
API 레퍼런스: https://developer.android.com/reference/android/text/format/DateUtils.html#isToday(long)
private boolean isSameDay(Date date1, Date date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2);
boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
return (sameDay && sameMonth && sameYear);
}
Kotlin dev의 경우 포맷된 문자열 비교 접근 방식을 사용하는 버전은 다음과 같습니다.
val sdf = SimpleDateFormat("yyMMdd")
if (sdf.format(date1) == sdf.format(date2)) {
// same day
}
최선의 방법은 아니지만 짧고 효과가 있습니다.
Binil Thomas 솔루션과 더불어
public static boolean isOnSameDay(Timestamp... dates) {
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
String date1 = fmt.format(dates[0]);
for (Timestamp date : dates) {
if (!fmt.format(date).equals(date1)) {
return false;
}
}
return true;
}
사용.
isOnSameDay(date1,date2,date3 ...);
//or
isOnSameDay(mydates);
JAVA 8에서는 변환 가능Date
LocalDate
오브젝트, 따라서 다음과 같이 할 수 있습니다.
public static boolean isDatesAreDifferentDays(Date date1,Date date2)
{
LocalDate d1 = date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate d2 = date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
if(d1.getDayOfMonth() != d2.getDayOfMonth())
{
return false;
}
else if(d1.getMonth() != d2.getMonth())
{
return false;
}
else if(d1.getYear() != d2.getYear())
{
return false;
}
else
{
return true;
}
}
SimpleDateFormat에 의존하지 않고 SimpleDateFormat 솔루션과 동일한 로직을 적용할 수 있습니다.
date1.getFullYear()*10000 + date1.getMonth()*100 + date1.getDate() ==
date2.getFullYear()*10000 + date2.getMonth()*100 + date2.getDate()
언급URL : https://stackoverflow.com/questions/2517709/comparing-two-java-util-dates-to-see-if-they-are-in-the-same-day
'programing' 카테고리의 다른 글
C에서 WinRT를 사용하시겠습니까? (0) | 2022.08.28 |
---|---|
Big Decimal equals() 대 compare To() (0) | 2022.08.28 |
경고를 수정할 수 없습니다. 중복 키가 검색되었습니다: '0'.이로 인해 업데이트 오류가 발생할 수 있습니다. (0) | 2022.08.28 |
v-for 구성 요소가 실시간으로 업데이트되지 않음 (0) | 2022.08.28 |
Laravel vue.js 및 vuex 본문 텍스트를 ID별로 링크하여 새 구성 요소에 표시 (0) | 2022.08.28 |