programing

Joda-Time에서 두 날짜 사이의 일수

prostudy 2022. 9. 4. 12:37
반응형

Joda-Time에서 두 날짜 사이의 일수

Joda-Time 인스턴스 간의 일수 차이는 어떻게 확인할 수 있습니까?'difference in days'는 시작일과 종료일이 월요일이고 종료일이 화요일인 경우 시작일과 종료일의 시간/분/초에 관계없이 반환값이 1이어야 합니다.

Days.daysBetween(start, end).getDays()저녁에 시작해서 아침에 끝나는 경우 0이 됩니다.

다른 날짜 필드에도 같은 문제가 있기 때문에 중요하지 않은 필드를 '무시'할 수 있는 일반적인 방법이 있었으면 합니다.

즉, 2월 4일부터 3월 4일까지의 달도 14시 45분부터 15시 12분까지와 마찬가지로 1이 됩니다.그러나 14:01과 14:55 사이의 시간 차이는 0이 됩니다.

유감스럽게도 withTimeAtStartOfDay의 답변은 틀리지만 극히 일부입니다.원하는 것:

Days.daysBetween(start.toLocalDate(), end.toLocalDate()).getDays()

"한밤중/낮의 시작"은 새벽 1시를 의미할 수 있습니다(일부 지역에서는 이렇게 낮 시간 절약이 이루어짐). Days.between은 제대로 처리되지 않습니다.

// 5am on the 20th to 1pm on the 21st, October 2013, Brazil
DateTimeZone BRAZIL = DateTimeZone.forID("America/Sao_Paulo");
DateTime start = new DateTime(2013, 10, 20, 5, 0, 0, BRAZIL);
DateTime end = new DateTime(2013, 10, 21, 13, 0, 0, BRAZIL);
System.out.println(daysBetween(start.withTimeAtStartOfDay(),
                               end.withTimeAtStartOfDay()).getDays());
// prints 0
System.out.println(daysBetween(start.toLocalDate(),
                               end.toLocalDate()).getDays());
// prints 1

경유하다LocalDate모든 문제를 회피합니다.

Days학급

메소드와 함께 클래스를 사용하면 다음과 같이 동작합니다.

Days.daysBetween(start.withTimeAtStartOfDay() , end.withTimeAtStartOfDay() ).getDays() 

다음을 사용할 수 있습니다.

Days.daysBetween(new LocalDate(start), new LocalDate(end)).getDays() 

dr;dr

java.time.temporal.ChronoUnit.DAYS.between( 
    earlier.toLocalDate(), 
    later.toLocalDate() 
)

…혹은…

java.time.temporal.ChronoUnit.HOURS.between( 
    earlier.truncatedTo( ChronoUnit.HOURS )  , 
    later.truncatedTo( ChronoUnit.HOURS ) 
)

java.time

참고로 Joda-Time 프로젝트는 현재 유지보수 모드에 있으며 팀은 java.time 클래스로의 이행을 권고하고 있습니다.

Joda-Time과 동등DateTimeZonedDateTime.

ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;

날짜를 날짜로 세고 싶으시군요. 즉, 하루 중 시간을 무시하고 싶으시군요.예를 들어 0시 1분 전에 시작하여 0시 1분 후에 종료하면 하루가 됩니다.이 동작에 대해서는,LocalDate에서ZonedDateTime클래스는 시간대 및 시간대를 포함하지 않는 날짜 전용 값을 나타냅니다.

LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;

경과 일수 또는 기타 단위를 계산하려면 열거를 사용합니다.

long days = ChronoUnit.DAYS.between( localDateStart , localDateStop ) ;

잘라내다

60분의 시간 간격의 완전한 시간이 아닌 시간 단위의 델타 시간에 관심이 있는 경우 이 계산을 수행하는 보다 일반적인 방법에 대해 질문할 경우 다음을 사용하십시오.truncatedTo방법.

같은 날 14:45~15:12의 예를 다음에 나타냅니다.

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime start = ZonedDateTime.of( 2017 , 1 , 17 , 14 , 45 , 0 , 0 , z );
ZonedDateTime stop = ZonedDateTime.of( 2017 , 1 , 17 , 15 , 12 , 0 , 0 , z );

long hours = ChronoUnit.HOURS.between( start.truncatedTo( ChronoUnit.HOURS ) , stop.truncatedTo( ChronoUnit.HOURS ) );

1

며칠 동안 작동하지 않습니다.이 경우 To LocalDate()를 사용합니다.


java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*②.

java.time 클래스는 어디서 얻을 수 있습니까?

쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 유용한 클래스가 있습니다.

쓰리텐 엑스트라 프로젝트는 java.time을 추가 클래스로 확장합니다.이 프로젝트는 향후 java.time에 추가될 수 있는 가능성을 입증하는 기반입니다.여기에는 , , , 유용한 클래스가 있습니다.

은 두 입니다.LocalDate많은 데이터를 읽는 경우 상당히 비싼 객체입니다.나는 이것을 사용한다.

  public static int getDaysBetween(DateTime earlier, DateTime later)
  {
    return (int) TimeUnit.MILLISECONDS.toDays(later.getMillis()- earlier.getMillis());
  }

「 」를 합니다.getMillis()기존 변수를 사용합니다.
MILLISECONDS.toDays()그런 다음 단순한 산술 계산을 사용하여 객체를 생성하지 않습니다.

java.time.Period

클래스를 사용하여 날짜를 세십시오.

은 Java 8을 사용하여 이 더 이기 때문에 8을 사용하여 차이를 계산할 수 있습니다.LocalDate,LocalDateTime

    LocalDate now = LocalDate.now();
    LocalDate inputDate = LocalDate.of(2018, 11, 28);

    Period period = Period.between( inputDate, now);
    int diff = period.getDays();
    System.out.println("diff = " + diff);

(KOTLIN) 일정 날짜와 현재 날짜의 차이(Joda)

하시면 됩니다.Days.daysBetween(jodaDate1,jodaDate2)

다음은 예를 제시하겠습니다.

        val dateTime: DateTime = DateTime.parse("14/09/2020",
            DateTimeFormat.forPattern("dd/MM/yyyy"))
        val currentDate = DateTime.now()
        //To calculate the days in between
        val dayCount = Days.daysBetween(dateTime,currentDate).days
        //Set Value to TextView 
        binding.daysCount.text = dayCount.toString()
DateTime  dt  = new DateTime(laterDate);        

DateTime newDate = dt.minus( new  DateTime ( previousDate ).getMillis());

System.out.println("No of days : " + newDate.getDayOfYear() - 1 );    
public static int getDifferenceIndays(long timestamp1, long timestamp2) {
    final int SECONDS = 60;
    final int MINUTES = 60;
    final int HOURS = 24;
    final int MILLIES = 1000;
    long temp;
    if (timestamp1 < timestamp2) {
        temp = timestamp1;
        timestamp1 = timestamp2;
        timestamp2 = temp;
    }
    Calendar startDate = Calendar.getInstance(TimeZone.getDefault());
    Calendar endDate = Calendar.getInstance(TimeZone.getDefault());
    endDate.setTimeInMillis(timestamp1);
    startDate.setTimeInMillis(timestamp2);
    if ((timestamp1 - timestamp2) < 1 * HOURS * MINUTES * SECONDS * MILLIES) {
        int day1 = endDate.get(Calendar.DAY_OF_MONTH);
        int day2 = startDate.get(Calendar.DAY_OF_MONTH);
        if (day1 == day2) {
            return 0;
        } else {
            return 1;
        }
    }
    int diffDays = 0;
    startDate.add(Calendar.DAY_OF_MONTH, diffDays);
    while (startDate.before(endDate)) {
        startDate.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    return diffDays;
}

언급URL : https://stackoverflow.com/questions/3802893/number-of-days-between-two-dates-in-joda-time

반응형