programing

2개의 java.util을 비교합니다.같은 날인지 확인하는 날짜

goodsources 2022. 8. 28. 09:59
반응형

2개의 java.util을 비교합니다.같은 날인지 확인하는 날짜

개를 가 있다Date s)date1 ★★★★★★★★★★★★★★★★★」date2 해서 ' )을 생각해 boolean sameDayDate는 같은 날을 공유합니다.거짓

이거 어떻게 해?여기 혼란의 소용돌이가 있는 것 같습니다...가능하면 JDK 이외의 의존관계를 끌어들이는 것은 피하고 싶습니다.

명확히 하기 위해:date1 ★★★★★★★★★★★★★★★★★」date2sameDay사실이거나, 그렇지 않으면 거짓입니다.「 」 「 」 、 「 」 。시간대를 지나면 좋겠지만 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은...InstantUTC의 입니다.합니다(「」).ZoneIdZonedDateTime, , 로컬클래스 「로컬 클래스: 「로컬」클래스는 「로컬」입니다.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" );

를 " " 에 합니다.InstantZonedDateTime 기 、 기 、 기 、 ( 、 ( 、 ( 、 ( ( ( 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에서는 변환 가능DateLocalDate오브젝트, 따라서 다음과 같이 할 수 있습니다.

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

반응형