2009-06-29 5 views
6

Joda 시간에 일수를 더하기위한 간단한 유틸리티 메소드를 작성하려고합니다. instant. 여기에 내 첫 찌르기가있다.JodaTime 인스턴트에 며칠 더하기

추가 일수가 BST/GMT 경계를 넘을 때 예제를 고려할 때를 제외하고는 대부분 잘됩니다. 여기에 작은 예가 있습니다.

public class DateAddTest { 

/** * 영역은 입력 및 출력을 위해 사용하는 */ 개인 정적 최종 DateTimeZone ZONE = DateTimeZone.forId ("유럽/런던");

/** 
* Formatter used to translate Instant objects to & from strings. 
*/ 
private static final DateTimeFormatter FORMATTER = DateTimeFormat.forPattern(DATE_FORMAT).withZone(ZONE); 


/** 
* Date format to be used 
*/ 
private static final String DATE_FORMAT = "dd/MM/yyyy"; 


public static void main(String[] args) { 

DateTime dateTime = FORMATTER.parseDateTime("24/10/2009"); 
Instant toAdd = dateTime.toInstant(); 
Instant answer = JodaTimeUtils.addNumberOfDaysToInstant(toAdd, 2); 

System.out.println(answer.toString(FORMATTER)); //25/10/2009 
} 

}

나는 간격이 ACOUNT으로는 BST 경계를 횡단했다는 사실을 고려하지 않기 때문에이 문제라고 생각합니다. 이것을 구현하는 더 좋은 방법에 대한 아이디어는 인정 될 것입니다.

+1

인스턴트 인수는 어떤 표준 시간대에서 생성되기를 기대합니까? 일관성이 있습니까? Jon이 제안한 원래 수정 값을 사용할 수 없으므로 값을 고려하지 않고 계산할 때 아무런 의미가 없습니다. – laz

답변

0

이 선택되었다 솔루션입니다.

/** 
* Zone to use for input and output 
*/ 
private static final DateTimeZone ZONE = DateTimeZone.forId("Europe/London"); 

/** 
* Adds a number of days specified to the instant in time specified. 
* 
* @param instant - the date to be added to 
* @param numberOfDaysToAdd - the number of days to be added to the instant specified 
* @return an instant that has been incremented by the number of days specified 
*/ 
public static Instant addNumberOfDaysToInstant(final Instant instant, final int numberOfDaysToAdd) { 
    return instant.toDateTime(ZONE).withFieldAdded(DurationFieldType.days(), numberOfDaysToAdd).toInstant(); 
} 
+4

이것은 간단합니다. return instant.toDateTime (ZONE) .plusDays (numberOfDaysToAdd) .toInstant(); – JodaStephen

7

을 처리하려면 인스턴트를 사용하지 마십시오. 나는 그것이 올바르게 순간에 48 시간을 추가하고 있다고 의심한다.

대신 LocalDate을 사용하고 plusDays 메서드를 사용하십시오.

특정 순간 이후 n 일 후에 발생하는 순간을 알기를 원하면 같은 시간에 의심의 여지없이 그 순간을 LocalDateLocalTime으로 나눕니다. LocalDate을 입력 한 다음 다시 어셈블하거나 LocalDateTime이 원하는 작업을하는지 확인하십시오. 그러나 원래 시간이 새 날에 두 번 발생하거나 전혀 발생하지 않으면 원하는 것을 해결해야합니다.

편집 : 좋아, 그래서 당신은 즉시 작업해야합니다. 원래 시간대에 있어야합니까? UTC를 사용할 수 있습니까? 그러면 DST 문제가 해결됩니다. 그렇지 않은 경우 모호성 또는 존재하지 않는 경우 (예 : 각 전환 전의 오전 12시 30 분)에 무엇을 수행하기를 원하십니까?

+0

LocalDate는이 경우 인스턴트보다 훨씬 유용하지만 다른 제약으로 인해 변경할 수 없다는 것을 알고 있습니다. –

2

코드의 나머지 부분을 가정 :

public static void main(String[] args) { 

    DateTime dateTime = FORMATTER.parseDateTime("24/10/2009"); 
    Instant pInstant = dateTime.withFieldAdded(DurationFieldType.days(),2).toInstant(); 
    System.out.println("24/10/2009 + 2 Days = " + pInstant.toString(FORMATTER)); 
}