2011-09-28 9 views
1

모두 소정의 로컬 시간에 하루의 시작을 계산자바 날짜 (달력) 날짜 시간

이 하나 사무실에서 힘든 하루를 갖는 ... 나는 운동에 하루의 시작을 시도하고있다 현지 시간, 즉 자정 00:00:00에 달력 날짜가 주어집니다.

주어진 다음의 일, 현지 시간으로 자정에 하루의 시작을 계산할 : 현재

 Time      Start Day (Local)   Start Day (GMT) 
2011-03-27 00:00:00 GMT -->  2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT 
2011-03-27 01:00:00 GMT -->  2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT 
2011-03-27 02:00:00 GMT -->  2011-03-27 00:00:00 GMT --> 2011-03-27 00:00:00 GMT 
2011-04-01 00:00:00 BST -->  2011-04-01 00:00:00 BST --> 2011-03-31 23:00:00 GMT 
2011-10-30 00:00:00 BST -->  2011-10-30 00:00:00 BST --> 2011-10-29 23:00:00 GMT 
2011-10-30 01:00:00 BST -->  2011-10-30 00:00:00 BST --> 2011-10-29 23:00:00 GMT 
2011-10-30 01:00:00 GMT -->  2011-10-30 00:00:00 BST --> 2011-10-29 23:00:00 GMT 
2011-11-01 00:00:00 GMT -->  2011-11-01 00:00:00 GMT --> 2011-11-01 00:00:00 GMT 

, 나는하여 SimpleDateFormat을 사용하여 GregorianCalendar를로 문자열 시간을 구문 분석하고있다. 이것은 나에게 GMT/UTC 시간을 알려줍니다.

public void setToStartOfDayLocally(GregorianCalendar cal) { 
    ???? 
} 

내가해야 할 일은 너무 확실하지 않다 :

public GregorianCalendar getCalendar(String dateTime) { 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    GregorianCalendar cal = new GregorianCalendar(); 
    cal.setTime(sdf.parse(dateTime, new ParsePosition(0))); 

    return cal; 
} 

이 지금은 로컬 자정으로 설정해야합니다

그래서 나는 해 GregorianCalendar에 문자열을 구문 분석하는 몇 가지 코드를 캘린더로 분당 할 수 있습니다. 불행히도 조만간 JODA 날짜로 이동하지는 않습니다. 나는 또한 나의 예와 다른 시간대를 고려하지 않는다.

의견이 있으십니까?

감사합니다, 그것은 당신 같은 소리

Andez

답변

0

:)이 훨씬 간단 모두를 만드는,하지만 Joda 시간 이동에 대해 소리를 만들기 시작 했죠. 나는 그것을 시간대에서 다른 시간대로 변환하기 위해 그것을 사용하고있다.

public static Date convertLocalDateToDateTimezone(Date localDate, String timezone) { 
    TimeZone localTimeZone = TimeZone.getDefault(); 
    TimeZone timezone = TimeZone.getTimeZone(timezone); 
    long gmtMillis = localDate.getTime(); 
    long result = gmtMillis + timezone.getOffset(gmtMillis) - localTimeZone.getOffset( gmtMillis); 
    return new Date(result); 
} 

희망이 있습니다.

0

는 제로로 시간 모든 부분을 설정합니다. 당신은 사용할 수 있습니다

반드시 유효하지만 아니라고
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 

(당신이 제대로 설정 달력에서 시간대를 가지고 가정.)

주 - 일부 시간대 (예 : 브라질), 일광 절약 시간 전환 자정에서 두 번 발생하거나 전혀 발생하지 않습니다.

개인적으로 나는이 코드는 문제를 해결할 수 있다고 생각

0

java.time

아웃 모드 클래스를 사용 중입니다. Java 8 이상에서는 기본 제공 java.time 프레임 워크를 사용하십시오.

시간이 00:00:00.0으로 시작한다고 가정하지 마십시오. DST (일광 절약 시간제)와 같은 예외 때문에 시작 시간은 시간대에 따라 다를 수 있습니다. java.time 클래스가 LocalDate::atStartOfDay을 호출하여 정확한 시간을 결정하게하십시오.

BST, EST 등과 같이 3-4 자의 영역 약어를 사용하지 마십시오. 그것들은 표준화되거나 고유하지 않습니다. proper time zone names을 사용하십시오.

Instant은 잠시만 타임 라인에 UTC입니다. 시간대를 적용하여 ZonedDateTime을 얻으십시오. 해당 날짜 - 시간 (LocalDate)에서 날짜 전용 값을 추출하십시오. 해당 시간대의 첫 번째 시간으로 설정된 ZonedDateTime으로 돌아가려면 atStartOfDay으로 전화가 걸린 시간대를 적용하십시오.

Instant now = Instant.now(); 
ZoneId zoneId = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = ZonedDateTime.ofInstant(instant , zoneId); 
LocalDate localDate = zdt.toLocalDate(); 
ZonedDateTime zdtStart = localDate.atStartOfDay(zoneId); 

팁 : "midnight"는 사용하지 마십시오. 정확한 정의가 없습니다. 어떤 사람들은 하루의 마지막 순간을 결정하려고 노력한다고 생각합니다. 그것은 무한하게 나눌 수있는 분수 때문에 문제입니다. 어떤 사람들은 특수 문자열 "24:00"을 사용하여 자정의 스트로크를 나타내어 날짜 - 시간 처리를 혼란스럽게 만듭니다. Joda-Time 프로젝트의 경험은 분명하고 정확한 의미로 "첫날"에 초점을 맞추는 것이 가장 좋습니다. 또한 첫 번째 순간은 이 아닌 항상 00:00:00이며 일광 절약 시간 (DST) 및 일부 시간대의 다른 예외로 인해 발생합니다. 그렇기 때문에 제로 시간을 하드 코딩하지 않고 atStartOfDay 방법을 사용합니다.

관련 문제