Преобразование даты календаря в соответствии с часовым поясом [дубликат]

Используя встроенную функцию списка, вы можете сделать это

a
out:[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
#Displaying the list

a.remove(a[0])
out:[[1, 1, 1, 1], [1, 1, 1, 1]]
# Removed the first element of the list in which you want altered number

a.append([5,1,1,1])
out:[[1, 1, 1, 1], [1, 1, 1, 1], [5, 1, 1, 1]]
# append the element in the list but the appended element as you can see is appended in last but you want that in starting

a.reverse()
out:[[5, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
#So at last reverse the whole list to get the desired list
167
задан Matt Johnson 30 June 2014 в 18:01
поделиться

7 ответов

Если кому-либо это понадобится, если вам нужно преобразовать часовой пояс XMLGregorianCalendar в текущий часовой пояс из UTC, то вам нужно всего лишь установить часовой пояс на 0, а затем вызвать toGregorianCalendar() - он останется тот же часовой пояс, но Date знает, как его преобразовать в ваш, поэтому вы можете получить данные оттуда.

XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar(
        ((GregorianCalendar)GregorianCalendar.getInstance());
xmlStartTime.setTimezone(0);
GregorianCalendar startCalendar = xmlStartTime.toGregorianCalendar();
Date startDate = startCalendar.getTime();
XMLGregorianCalendar xmlStartTime = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar(startCalendar);
xmlStartTime.setHour(startDate.getHours());
xmlStartTime.setDay(startDate.getDate());
xmlStartTime.setMinute(startDate.getMinutes());
xmlStartTime.setMonth(startDate.getMonth()+1);
xmlStartTime.setTimezone(-startDate.getTimezoneOffset());
xmlStartTime.setSecond(startDate.getSeconds());
xmlStartTime.setYear(startDate.getYear() + 1900);
System.out.println(xmlStartTime.toString());

Результат:

2015-08-26T12:02:27.183Z
2015-08-26T14:02:27.183+02:00
249
ответ дан JJD 21 August 2018 в 02:54
поделиться
  • 1
    если дата создана из класса Calendar, вы можете установить часовой пояс для Календаря. – lwpro2 11 January 2013 в 05:07
  • 2
    Хороший ответ, это помогло мне. Благодарю. – EM-Creations 25 March 2013 в 19:15
  • 3
    Я хочу проголосовать за этот ответ несколько раз человек! Это помогло мне. – Gugan 6 September 2013 в 07:00
  • 4
    Это помогло мне. время установкиZone в SDF не делало никаких различий – vishnu viswanath 18 December 2013 в 17:58
  • 5
    Я считаю его более надежным. (+1) – foobar 20 December 2013 в 14:23
  • 6
    Остерегайтесь: Вызов TimeZone.setDefault довольно резкий, поскольку он влияет на всю JVM, влияет на все другие объекты и потоки. См. этот ответ для деталей, включая еще больше осложнений, если вы работаете с SecurityManager. Добавление еще большего количества осложнений: это поведение изменилось в разных версиях Java, как обсуждалось в this Question . – Basil Bourque 2 March 2014 в 12:53
  • 7
    @ lwpro2 это утверждение вводит в заблуждение; Вы можете установить часовой пояс для объекта Calendar, но получение объекта Date из него с помощью метода getTime () возвращает объект Date с часовым поясом главного компьютера. – BrDaHa 8 December 2014 в 22:37
  • 8
    Мне трудно разобрать 02/20/15 14:44. Может кто-нибудь помочь – M.S 20 February 2015 в 10:16
  • 9
    Это устанавливает общий часовой пояс для всех потоков, порожденных после этого утверждения, не так ли? – Jaydev 13 May 2016 в 07:36
  • 10
    Небезопасная, опасность. – Dyorgio 20 January 2017 в 19:27
257
ответ дан JJD 31 October 2018 в 22:03
поделиться

Преобразуйте Date в String и сделайте это с помощью SimpleDateFormat.

    SimpleDateFormat readFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    readFormat.setTimeZone(TimeZone.getTimeZone("GMT" + timezoneOffset));
    String dateStr = readFormat.format(date);
    SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date date = writeFormat.parse(dateStr);
0
ответ дан avisper 21 August 2018 в 02:54
поделиться
  • 1
    Ожидается, что ответы на переполнение стека будут обсуждены или объяснены. Этот сайт должен быть больше, чем библиотека фрагмента кода. – Basil Bourque 17 January 2018 в 17:38
  • 2
    спасибо @Basil Bourque за ваш комментарий. Я редактирую ответ – avisper 18 January 2018 в 20:34

java.util.Calendar - обычный способ обработки часовых поясов с использованием только классов JDK. Apache Commons имеет некоторые дополнительные альтернативы / утилиты, которые могут быть полезны. Заметка Edit Spong напомнила мне, что я слышал действительно хорошие вещи о Joda-Time (хотя я сам не использовал его).

60
ответ дан Basil Bourque 21 August 2018 в 02:54
поделиться
  • 1
    +1 для времени Джоды. Хотя он не предоставляет каких-либо дополнительных функций, которые вы не могли получить из стандартного Java API (который я нашел в любом случае - счастлив, что вас показывают иначе), Joda Time делает некоторые задачи более легкими. – Joshua Hutchison 18 February 2013 в 13:07
  • 2
    – Basil Bourque 2 March 2014 в 12:32
  • 3
    & quot; Нет часового пояса в j.u.Date & quot; неправильно. Информация о часовом поясе в j.u.Date хранится в свойстве BaseCalendar.Date cdate, если она установлена. Взгляните на исходный код здесь . Вы не можете установить часовой пояс для объекта j.u.Date, кроме как изменить часовой пояс по умолчанию JVM, вызвав TimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));. Таким образом, существует смещение часового пояса, и вы можете получить смещение, вызвав устаревший метод j.u.Date.getTimezoneOffset () – Thai Bui 8 January 2015 в 22:22
  • 4
    @blquythai Правильно, вы сделали домашнее задание. Как и я, раньше видел этот исходный код. Там есть часовой пояс, зарытый там. Но для всех практических целей часовой пояс игнорируется. Java.util.Date работает без какого-либо часового пояса, действуя в UTC, игнорируя этот скрытый часовой пояс. За исключением метода toString, который применяет текущий часовой пояс JVM; снова игнорируя скрытый часовой пояс. Поэтому для краткости мы говорим, что java.util.Date не имеет часового пояса. Как искусство , это ложь, которая говорит правду. – Basil Bourque 9 January 2015 в 06:34
  • 5
    @blquythai Что касается вызова TimeZone.setDefault, вы not устанавливаете часовой пояс объекта java.util.Date - объект Date по-прежнему игнорирует свой скрытый часовой пояс, действуя эффективно в UTC. Вы повлияли бы на метод даты toString. Установка по умолчанию изменяет часовой пояс JVM по умолчанию, который обычно устанавливается в часовом поясе операционной системы хоста. Этот вызов не рекомендуется , поскольку он влияет на весь код во всех потоках всех приложений, запущенных в этой JVM, и делает это «на лету», когда они выполняются. Будучи грубым и опасным, этот вызов следует рассматривать только как последнее средство. – Basil Bourque 9 January 2015 в 06:41
  • 6
    Эта часовая зона используется очень часто (используется в equals, hashcode, getTime ..) Если вы посмотрите на метод equals, он вызывает getTime(), который вызывает getTimeImpl(), который вызывает normalize(), если свойство cdate не нормировано. В методе normalize() последнее условие if повторно вычисляет миллисекунды с 1/1/70 на основании сохраненной информации о часовом поясе, если часовой пояс cdate отличается от часового пояса текущей среды JVM, на котором он запущен. (Взгляните на sun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)) – Thai Bui 9 January 2015 в 19:27
  • 7
    @MichalM За ваш совет, некоторое время назад я добавил послесловие о встроенной зоне. – Basil Bourque 22 December 2017 в 19:10

Если вы должны работать только с обычными классами JDK, вы можете использовать это:

/**
 * Converts the given <code>date</code> from the <code>fromTimeZone</code> to the
 * <code>toTimeZone</code>.  Since java.util.Date has does not really store time zome
 * information, this actually converts the date to the date that it would be in the
 * other time zone.
 * @param date
 * @param fromTimeZone
 * @param toTimeZone
 * @return
 */
public static Date convertTimeZone(Date date, TimeZone fromTimeZone, TimeZone toTimeZone)
{
    long fromTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, fromTimeZone);
    long toTimeZoneOffset = getTimeZoneUTCAndDSTOffset(date, toTimeZone);

    return new Date(date.getTime() + (toTimeZoneOffset - fromTimeZoneOffset));
}

/**
 * Calculates the offset of the <code>timeZone</code> from UTC, factoring in any
 * additional offset due to the time zone being in daylight savings time as of
 * the given <code>date</code>.
 * @param date
 * @param timeZone
 * @return
 */
private static long getTimeZoneUTCAndDSTOffset(Date date, TimeZone timeZone)
{
    long timeZoneDSTOffset = 0;
    if(timeZone.inDaylightTime(date))
    {
        timeZoneDSTOffset = timeZone.getDSTSavings();
    }

    return timeZone.getRawOffset() + timeZoneDSTOffset;
}

Кредит переходит к этому сообщению .

5
ответ дан diadyne 21 August 2018 в 02:54
поделиться
  • 1
    Смещение часовых поясов не всегда является постоянным. Фактически, они могут измениться из-за геополитических причин. TimeZone.getDSTSavings () не учитывает это и всегда возвращает смещение current . Это означает, что вы можете получить неправильное преобразование в случае, если вы имеете дело с исторической датой с помощьюTimeZone / toTimeZone, которая изменила смещения с этой даты. – andrerobot 29 November 2016 в 20:28

Имейте в виду, что объекты java.util.Date сами не содержат информацию о часовом поясе - вы не можете установить часовой пояс на объект Date. Единственное, что содержит объект Date, - это количество миллисекунд с момента «эпохи» - 1 января 1970 года, 00:00:00 UTC.

Как показывает ZZ Coder, вы устанавливаете часовой пояс на DateFormat, чтобы указать, в какой часовой пояс вы хотите отображать дату и время.

133
ответ дан Jesper 21 August 2018 в 02:54
поделиться
  • 1
    После Googling, экспериментируя и выписывая, я понял, что это точное и полезное дополнение к ответу - и стоит выделить: Дата содержит только миллисекундное значение . Если вы посмотрите на источник, есть довольно просто поле long, называемое fastTime. Date.toString() фактически использует Calendar для интерпретации этого миллисекундного времени. Таким образом, печать Date приводит к тому, что появляется , чтобы иметь (по умолчанию) часовой пояс, что приводит к понятным вопросам о том, как установить этот часовой пояс. – David Carboni 11 July 2012 в 14:41
  • 2
    есть информация о часовом поясе внутри объектов Date. Но это может быть правдой, вы не можете ее изменить. – lwpro2 11 January 2013 в 05:09
  • 3
    @ Iwpro2, Джеспер утверждает (и я согласен), что объект Date не хранит часовой пояс. Если вы утверждаете, что часовой пояс хранится внутри java.util.Date, пожалуйста, укажите ссылку. – Jim 20 August 2013 в 20:57
  • 4
  • 5
    @Jim Я не сказал, что вы можете установить его, я говорил, что он содержит эту информацию. Я не вижу способа установить его как пользователя. Я думаю, что OP правилен тем, что он всегда является часовым поясом пользователя / системы по умолчанию. – eis 9 September 2013 в 20:51
64
ответ дан Basil Bourque 31 October 2018 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: