전자 메일을 보낸 시간대를 저장해야합니다. 전자 메일의 'Date :'헤더 (RFC822 날짜)에서 추출하는 가장 좋은 방법은 무엇입니까? 그리고 데이터베이스에 저장할 때 권장되는 형식은 무엇입니까 (최대 절전 모드를 사용하고 있습니까?).메일에서 시간대를 추출하는 가장 좋은 방법은 Java의 날짜 헤더입니까?
답변
일종의 하위 문자열 또는 정규 표현식을 사용하여 헤더에서 데이터를 추출합니다. SimpleDateFormatter로 날짜를 구문 분석하여 Date 객체를 만듭니다.
아마도 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로 변환 한 후 시간대와 함께 날짜를 저장해야합니다.
시간대를 제거하거나 처리하지 않으면 다른 시간대의 데이터를 처리 할 때 문제가 발생합니다.
** 틀렸어! ** 정확한 시간과 Joda와 같은 현대적인 datetime 라이브러리를 사용하는 한 DateTime *을 * 표준 시간대와 함께 저장하는 것이 훨씬 좋습니다. 그것은 TimeZone을 처리합니다. 시간대를 버리고 사용자가 특히 모바일/글로벌 응용 프로그램에 유용 할 수있는 데이터를 UTC로 정규화하면됩니다. ** SimpleDateFormat은 스레드 세이프가 아닙니다! ** ... -1. –
@AdamGent 그건 내가 "당신이 제거하거나 문제를 일으킬 수있는 시간대를 처리하지 않으면 ...."이라는 의미입니다. 이 수정 사항을 명확하게 편집하겠습니다. –
블로그 게시물도 제거하거나 atl east에서 simpleedateform의 공용 정적 배열을 만드는 심각한 동시성 위험을주의하십시오. –
이메일의 시간대가 전송 된 시간대에 표시되지 않습니다. 일부 프로그램은 UTC 또는 GMT를 사용합니다. 물론 시간대는 날짜 시간 값의 일부이며 해석해야합니다.
왜 알고 싶은가요? - 타임 스탬프를 정규화 하시겠습니까? 그런 다음 구문 분석을 위해 DateFormat을 사용하십시오. - 전자 메일을 보내는 사용자의 시간을 알아 보시겠습니까? 이것은 올바르게 작동하지 않습니다.
귀하의 의견 중 하나에서 이미 언급 한 것처럼 보이지만 최선의 답변이라고 생각합니다. JavaMail 라이브러리에는 javax.mail.internet.MailDateFormat
에 RFC822 Date 헤더 구문 분석 코드가 들어 있습니다. 불행히도 TimeZone 파싱을 직접적으로 드러내지 않으므로 javax.mail.internet.MailDateParser
에서 직접 필요한 코드를 복사해야하지만 이미 수행 한 작업을 충분히 활용하는 것이 좋습니다.
파서는 날짜를 오프셋으로 줄 것이므로 int
으로 저장할 수 있어야한다. (최대 절전 모드로 데이터베이스에 저장하면된다.)
그는 친숙한 스코어가있는 (아이러니 한) MailDateParser 대신 Mime4J DateTime 파서를 사용할 수 있습니다. 내 대답을 보라. –
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).
감사합니다. jhawk28. 그러나 MailDateFormat 클래스를 사용하여 Date를 가져올 수 있습니다. 이 클래스는 또한 표준 시간대를 파싱하지만 MailDateParser에서 코드를 복사하는 것을 제외하고는 TimeZone을 쉽게 찾을 수없는 것 같습니다. – mmartijn