2008-09-20 5 views

답변

0

일종의 하위 문자열 또는 정규 표현식을 사용하여 헤더에서 데이터를 추출합니다. SimpleDateFormatter로 날짜를 구문 분석하여 Date 객체를 만듭니다.

+0

감사합니다. jhawk28. 그러나 MailDateFormat 클래스를 사용하여 Date를 가져올 수 있습니다. 이 클래스는 또한 표준 시간대를 파싱하지만 MailDateParser에서 코드를 복사하는 것을 제외하고는 TimeZone을 쉽게 찾을 수없는 것 같습니다. – mmartijn

1

아마도 ISO9601을 지원하므로 JodaTime을 구문 분석하는 것이 가장 쉽습니다. Date and Time Parsing and Formatting in Java with Joda Time을 참조하십시오.

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis(); 
System.out.println(parser2.parseDateTime(your_date_string)); 

시간은 항상 시간대와 UTC (GMT)에 저장해야합니다 - 즉, GMT의 시간대로 변환하고 원래의 시간대를 일광 절약 오프셋을 제거하고 저장 구문 분석 후.

UTC로 변환 한 후 시간대와 함께 날짜를 저장해야합니다.

시간대를 제거하거나 처리하지 않으면 다른 시간대의 데이터를 처리 할 때 문제가 발생합니다.

+0

** 틀렸어! ** 정확한 시간과 Joda와 같은 현대적인 datetime 라이브러리를 사용하는 한 DateTime *을 * 표준 시간대와 함께 저장하는 것이 훨씬 좋습니다. 그것은 TimeZone을 처리합니다. 시간대를 버리고 사용자가 특히 모바일/글로벌 응용 프로그램에 유용 할 수있는 데이터를 UTC로 정규화하면됩니다. ** SimpleDateFormat은 스레드 세이프가 아닙니다! ** ... -1. –

+0

@AdamGent 그건 내가 "당신이 제거하거나 문제를 일으킬 수있는 시간대를 처리하지 않으면 ...."이라는 의미입니다. 이 수정 사항을 명확하게 편집하겠습니다. –

+0

블로그 게시물도 제거하거나 atl east에서 simpleedateform의 공용 정적 배열을 만드는 심각한 동시성 위험을주의하십시오. –

0

이메일의 시간대가 전송 된 시간대에 표시되지 않습니다. 일부 프로그램은 UTC 또는 GMT를 사용합니다. 물론 시간대는 날짜 시간 값의 일부이며 해석해야합니다.

왜 알고 싶은가요? - 타임 스탬프를 정규화 하시겠습니까? 그런 다음 구문 분석을 위해 DateFormat을 사용하십시오. - 전자 메일을 보내는 사용자의 시간을 알아 보시겠습니까? 이것은 올바르게 작동하지 않습니다.

+0

이메일을 보낸 사용자의 시간대를 감지하고 싶습니다. 왜이게 효과가 없을까요? – mmartijn

+0

일부 프로그램은 사용자의 시간대와 관계없이 UTC 또는 GMT 시간을 전송하기 때문에. 형식이 지정된 날짜 문자열의 시간대이며 사용자 컴퓨터가 아닙니다. – Horcrux7

0

귀하의 의견 중 하나에서 이미 언급 한 것처럼 보이지만 최선의 답변이라고 생각합니다. JavaMail 라이브러리에는 javax.mail.internet.MailDateFormat에 RFC822 Date 헤더 구문 분석 코드가 들어 있습니다. 불행히도 TimeZone 파싱을 직접적으로 드러내지 않으므로 javax.mail.internet.MailDateParser에서 직접 필요한 코드를 복사해야하지만 이미 수행 한 작업을 충분히 활용하는 것이 좋습니다.

파서는 날짜를 오프셋으로 줄 것이므로 int으로 저장할 수 있어야한다. (최대 절전 모드로 데이터베이스에 저장하면된다.)

+0

그는 친숙한 스코어가있는 (아이러니 한) MailDateParser 대신 Mime4J DateTime 파서를 사용할 수 있습니다. 내 대답을 보라. –

0

Mime4J을 사용하는 것이 좋습니다.

라이브러리는 모든 종류의 이메일 쓰레기를 파싱하기 위해 설계되었습니다. 날짜를 파싱하려면 DateTimeParser을 사용합니다.

int zone = new DateTimeParser(new StringReader("Fri, 27 Jul 2012 09:13:15 -0400")).zone(); 

는 그 후 나는 보통 Joda's DateTime에 날짜 시간을 변환합니다. SimpleDateFormatter는 RFC822의 모든 케이스를 다루지 않으므로 사용하지 마십시오.

다음은 자바의 TZ보다 우수한 Joda TimeZone (위의 int 영역에서)입니다.

// Stupid hack in case the zone is not in [-+]zzzz format 
final int hours; 
final int minutes; 
if (zone > 24 || zone < -24) { 
    hours = zone/100; 
    minutes = minutes = Math.abs(zone % 100); 
} 
else { 
    hours = zone; 
    minutes = 0; 
} 
DateTimeZone.forOffsetHoursMinutes(hours, minutes); 

지금 유일한 문제는 시간대는 (항상 여전히 이메일을 보내는 사용자의 올바른 시간대하지 않을 수 있습니다 숫자 시간대를 할 수 가정합니다 메일 앱이 사용자에게 전송한다는 것입니다 TZ 및 UTC가 아님).

예를 들어 일광 절약 시간을 고려하지 않았기 때문에 -0400은 EDT가 아닙니다 (예 : America/New_York).