2011-12-30 3 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 Time] (http://joda-time.sourceforge.net/)? –

ответ

0

Дата рождения: Дата рождения: Дата рождения: Дата возвращения в GMT. Когда вам нужно отображать в интерфейсе или в каком-либо месте, вам нужно использовать сформированную строку, сгенерированную на шаге 1.

2

Класс Date - это всего лишь тонкая обертка вокруг количества миллисекунд за «эпоху» (1 января 1970 года, 00:00:00 по Гринвичу). Он не сохраняет информацию о часовом поясе. В последнем вызове вы добавляете экземпляр даты в String, который неявно вызывает метод toString(). Метод 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 & Календарь классы в комплекте с Java, как известно, хлопотное. Избежать их. Используйте Joda-Time или новый пакет java.time. * В комплекте с Java 8.

В 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 

Java.время

Такая же идея использует классы java.time, которые вытесняют Joda-Time.

Класс Instant представляет собой момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.now(); 

Применение часового пояса.

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

instant и zdt представляют собой один и тот же момент, ту же точку на временной шкале. Каждый из них просматривается через объектив другого региона wall-clock time.

Создайте строку, указав шаблон форматирования или давая java.time автоматически локализовать.

Для локализации, указать:

  • FormatStyle, чтобы определить, как долго или сокращенно должна быть строка.
  • Locale определить (а) человеческий язык для перевода имени дня, названия месяца и т. Д. И (b) культурные нормы, определяющие вопросы сокращения, капитализации, пунктуации и т. Д.

Пример:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL).withLocale(l); 
String output = zdt.format(f); 
Смежные вопросы