2011-12-30 5 views
0
Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("PST")); 
cal.setTime(new Date()); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Date resultdate = new Date(cal.getTimeInMillis()); 
sdf.setTimeZone(TimeZone.getTimeZone("PST")); 

System.out.println("String date:"+sdf.format(resultdate)); 
System.out.println("Date:"+sdf.parse(sdf.format(resultdate))); 

출력 날짜와 시간을 변환하는 방법 :사용자 시간대에

String date:2011-12-29 09:01:58 PM            
Date:Fri Dec 30 10:31:58 IST 2011 

문제 :

  1. sdf.format(resultdate)이 시간대에 따라에 정확한 날짜와 시간을 반환합니다. 그러나
  2. sdf.parse(sdf.format(resultdate)) 올바른 날짜 및 시간이 시간대대로 반환되지 않는 경우이 문제를 해결하는 방법은 무엇입니까?
+0

방금 ​​[Joda 시간]을 사용할 수 없습니다 (http://joda-time.sourceforge.net/)? –

답변

0

불행히도 자바 날짜는 GMT로만 시간을 반환합니다. 프런트 엔드 또는 일부 위치에서 디스플레이를 원할 때 step1에서 생성 된 형식화 된 문자열을 사용해야합니다.

2

Date 클래스는 '신기원'(1 월 1 일, 1970, 00:00:00 GMT)을 지난 밀리 초 단위의 단순한 래퍼입니다. 시간대 정보는 저장하지 않습니다. 마지막 호출에서 암시 적으로 toString() 메서드를 호출하는 String에 날짜 인스턴스를 추가하고 있습니다. toString() 메서드는 기본 시간대를 사용하여 인스턴스를 나타내는 String을 만듭니다 (시간대 정보를 저장하지 않으므로). toString() 메소드를 사용하지 않으려면 마지막 행을 수정하십시오.

System.out.println("Date:" + sdf.format(sdf.parse(sdf.format(resultdate)))); 
0

아래의 코드를 시도하면 효과가 있습니다.

Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("PST")); 
cal.setTime(new Date()); 

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Date resultdate = new Date(cal.getTimeInMillis()); 
sdf.setTimeZone(TimeZone.getTimeZone("PST")); 

System.out.println("String date:"+sdf.format(resultdate)); 
System.out.println("Date:"+sdf2.parse(sdf.format(resultdate))); 
0

세 글자 시간대 코드

않도록 세 글자 시간대 코드를 사용. 그것들은 표준화되거나 고유하지 않습니다. 예를 들어 IST은 인도 표준시 아일랜드 표준시를 모두 의미합니다. 또한 코드는 일광 절약 시간제 (DST)를 구별하기위한 것이지만 문제는 혼란 스럽습니다.

descriptive time zone names을 사용하여 DST 및 기타 문제를 포함하는 표준 시간대 개체를 검색하십시오.

는 Joda 타임

자바에 번들 된 java.util.Date & 달력 클래스는 악명 골칫거리입니다. 그들을 피하십시오. Joda-Time 또는 Java 8 번들로 제공되는 새로운 java.time. * 패키지를 사용하십시오.

JodaTime에서 DateTime 객체는 java.util.Date와는 달리 고유 한 시간대를 실제로 알고 있습니다. 보통 우리는 Joda-Time에서 불변 클래스를 사용합니다. 따라서 DateTime 객체에서 표준 시간대를 변경하는 대신 새 값인 DateTime 객체를 이전 버전을 기반으로하지만 지정된 차이를 기반으로 만듭니다. 다른 시간대가 그 차이 일 수 있습니다.

다음은 몇 가지 예제 코드입니다.

DateTimeZone timeZone_India = DateTimeZone.forID("Asia/Kolkata"); 
DateTimeZone timeZone_Ireland = DateTimeZone.forID("Europe/Dublin"); 
DateTimeZone timeZone_US_West_Coast = DateTimeZone.forID("America/Los_Angeles"); 

DateTime now = new DateTime(timeZone_India); 

System.out.println("now in India: " + now); 
System.out.println("now in Ireland: " + now.withZone(timeZone_Ireland)); 
System.out.println("now in US West Coast: " + now.withZone(timeZone_US_West_Coast)); 
System.out.println("now in UTC/GMT: " + now.withZone(DateTimeZone.UTC)); 

실행 ...

now in India: 2014-02-10T13:52:27.875+05:30 
now in Ireland: 2014-02-10T08:22:27.875Z 
now in US West Coast: 2014-02-10T00:22:27.875-08:00 
now in UTC/GMT: 2014-02-10T08:22:27.875Z 

자바.time

Joda-Time을 대신하는 java.time 클래스를 사용하는 것과 같은 아이디어.

Instant 클래스는 nanoseconds (소수 자릿수 9 자릿수까지)의 해상도로 UTC의 타임 라인에있는 순간을 나타냅니다.

Instant instant = Instant.now(); 

표준 시간대를 적용하십시오.

ZoneId z = ZoneId.of("America/Montreal"); 
ZonedDateTime zdt = instant.atZone(z); 
instant

zdt와 동일한 순간에, 타임 라인상의 동일한 점을 나타낸다. 각 렌즈는 다른 지역의 wall-clock time 렌즈를 통해 보입니다.

서식 패턴을 지정하거나 java.time이 자동으로 현지화되도록하여 문자열을 생성하십시오.

지정, 현지화 :

  • FormatStyle 문자열이 있어야 할 시간 또는 약식 결정.
  • Locale (a) 일명, 월 이름 등의 번역을위한 인간 언어 및 (b) 약어, 대문자, 구두점 등의 문제를 결정하는 문화적 규범을 결정할 수 있습니다.

예 :

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l); 
String output = zdt.format(f); 
관련 문제