Как преобразовать Java-дату в объект даты на основе часового пояса? - PullRequest
1 голос
/ 14 декабря 2011

Поэтому я сохраняю отметку времени как объект Date, а часовой пояс как объект TimeZone.

Теперь я хочу создать функцию, которая принимает объект Date и объект TimeZone в качестве аргумента и возвращает объект Date, настроенный с использованием отметки времени.

Например:

Ввод:

Date    TimeZone 

12:00   Moscow Standard Time (UTC+3)

Выход:

Date 

3:00    

Редактировать: Удалено Примечание о Calendar

Ответы [ 4 ]

7 голосов
/ 14 декабря 2011

A java.util.Date - абсолютный момент времени. 0900 часов UTC и 1200 часов UTC + 3 - это абсолютно одинаковые java.util.Date объекты. В него не нужно вносить «корректировку» для представления того или другого.

Чтобы получить удобочитаемое представление, учитывающее конкретный часовой пояс, вы можете установить часовой пояс для объекта DateFormat.

DateFormat format = new SimpleDateFormat("HH:mm");
format.setTimeZone(TimeZone.getTimeZone("UTC+3"));
String time = format.format(yourDate);

Решение вопроса, поставленного в комментарии:

Calendar cal1 = Calendar.getInstance(TimeZone.getTimeZone("UTC+3"));
cal1.setTime(yourDate);
Calendar cal2 = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
cal2.clear();
cal2.set(Calendar.YEAR, cal1.get(Calendar.YEAR));
cal2.set(Calendar.MONTH, cal1.get(Calendar.MONTH));
cal2.set(Calendar.DATE, cal1.get(Calendar.DATE));
cal2.set(Calendar.HOUR_OF_DAY, cal1.get(Calendar.HOUR_OF_DAY));
//simile for whatever level of field precision is needed
Date shiftedDate = cal2.getTime();
1 голос
/ 14 декабря 2011

Вот, пожалуйста:

/**
 * Convert a calendar from its current time zone to UTC (Greenwich Mean Time)
 * @param local the time
 * @return a calendar with the UTC time
 */
public static Calendar convertTimeToUtc(Calendar local){
    int offset = local.getTimeZone().getOffset(local.getTimeInMillis());
    GregorianCalendar utc = new GregorianCalendar(TZ_UTC);
    utc.setTimeInMillis(local.getTimeInMillis());
    utc.add(Calendar.MILLISECOND, -offset);

    return utc;
}

/**
 * Convert a UTC date into the specified time zone
 * @param tzName the name of the time zone for the output calendar
 * @param utc the UTC time being converted
 * @return a calendar in the specified time zone with the appropriate date
 */
public static Calendar convertTimeToLocal(String tzName, Calendar utc) {
    TimeZone zone = TimeZone.getTimeZone(tzName);
    int offset = zone.getOffset(utc.getTimeInMillis());
    GregorianCalendar local = new GregorianCalendar(zone);
    local.setTimeInMillis(utc.getTimeInMillis());
    local.add(Calendar.MILLISECOND, offset);

    return local;
}

/**
 * Convert a UTC date into the specified time zone
 * @param zone the time zone of the output calendar
 * @param utc the UTC time being converted
 * @return a calendar in the specified time zone with the appropriate date
 */
public static Calendar convertTimeToLocal(TimeZone zone, Calendar utc) {
    int offset = zone.getOffset(utc.getTimeInMillis());
    GregorianCalendar local = new GregorianCalendar(zone);
    local.setTimeInMillis(utc.getTimeInMillis());
    local.add(Calendar.MILLISECOND, offset);

    return local;
}
0 голосов
/ 14 декабря 2011

Я нашел простой способ сделать это, используя rowOffset желаемого часового пояса:

Date date = new Date();
int rawOffset = TimeZone.getTimeZone("EST").getRawOffset(); 
Date adjustedDate = new Date(date.getTime() + rawOffset)

Редактировать: как указывает Аффе, это будет игнорировать дополнительные секунды и переход на летнее время.

0 голосов
/ 14 декабря 2011

Если вы не используете Календарь, что вы используете?Может быть, другая библиотека?

Если нет, у вас есть +3 там в конце вашего часового пояса ... вы можете использовать это, чтобы поднять час (+/-) X;в этом случае +3.Просто помните, что в этом случае (например) 11 + 3 = 2.Эта математика может быть достигнута путем добавления часа + смещения, принимая это значение% 12 и устанавливая этот ответ в качестве часа (устанавливая ответ от 0 до 12, если это необходимо).Имеет ли это смысл?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...