Как конвертировать дату и время в часовой пояс пользователя - PullRequest
0 голосов
/ 30 декабря 2011
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)) Не возвращает правильную дату и время в соответствии с часовым поясом, как решить эту проблему?

Ответы [ 5 ]

2 голосов
/ 30 декабря 2011

Класс Date - это всего лишь тонкая оболочка на количество миллисекунд после «эпохи» (1 января 1970 года, 00:00:00 по Гринвичу). Он не хранит информацию о часовом поясе. При последнем вызове вы добавляете экземпляр даты к String, который неявно вызывает метод toString(). Метод toString() будет использовать часовой пояс по умолчанию для создания String, представляющего экземпляр (так как он не хранит никакой информации о часовом поясе). Попробуйте изменить последнюю строку, чтобы избежать использования метода toString().

System.out.println("Date:" + sdf.format(sdf.parse(sdf.format(resultdate))));
1 голос
/ 30 декабря 2011

Попробуйте использовать joda-Time api для вашего удобства.Пример здесь

0 голосов
/ 10 февраля 2014

трехбуквенные коды часовых поясов

Избегайте использования трехбуквенных кодов часовых поясов. Они не стандартизированы и не уникальны. Например, IST означает и стандартное время Индии и ирландское стандартное время. Кроме того, коды предназначены для различения летнего времени (DST), но это только сбивает с толку.

Используйте правильные описательные имена часовых поясов , чтобы извлечь объект часового пояса, который охватывает DST и другие проблемы.

Joda-Time

Классы java.util.Date и Calendar в комплекте с 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.time

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

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

Instant instant = Instant.now();

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

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

instant и zdt представляют один и тот же момент, одну и ту же точку на временной шкале. Каждый виден сквозь линзу времени настенного времени другого региона .

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

Для локализации укажите:

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

Пример:

Locale l = Locale.CANADA_FRENCH ; 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( l );
String output = zdt.format( f );
0 голосов
/ 03 января 2013

попробуйте приведенный ниже код, он будет работать.

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 голосов
/ 30 декабря 2011

Неудачная дата Java возвращает время только по Гринвичу. Когда вам захочется отобразить в переднем конце или где-то еще, вам нужно использовать форматированную строку, сгенерированную в вашем шаге 1.

...