Вопрос по timezone, java – Разбор форматированной строки даты в другом объекте TimeZone для даты не работает

3

Я пытаюсь преобразовать форматированную строку даты в объект Date. Дата Строка отформатирована в другой часовой пояс.

Когда я делаюsdf.parse(String) он возвращает мне мой объект системной даты.

Код как ниже,

static Date convertGMTTime(String timeZone, long longDate){
    Date convertedTime = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    try{
        Date date = new Date(longDate);
        System.out.println("timezone: "+timeZone +", timestamp: "+date);
        Locale locale = Locale.ENGLISH;
        TimeZone destTimeZone = TimeZone.getTimeZone(timeZone);// TimeZone.getDefault();
        System.out.println("Source timezone: "+destTimeZone);
/*          DateFormat formatter = DateFormat.getDateTimeInstance(
                    DateFormat.DEFAULT,
                    DateFormat.DEFAULT,
                    locale);
        formatter.setTimeZone(destTimeZone);*/
        sdf.setTimeZone(destTimeZone);
        String convertedDateStr = sdf.format(date);
        System.out.println("convertedDateStr: "+convertedDateStr);
        convertedTime = sdf.parse(convertedDateStr);
        System.out.println("convertedTime: "+convertedTime + "sdf: "+sdf.getTimeZone());
    }catch(Exception e){
        e.printStackTrace();
    }
    return convertedTime;
}

Буду признателен, если кто-нибудь может помочь и указать, где я иду не так. Заранее спасибо.

Выход:

timezone: Atlantic/Cape_Verde, timestamp: Tue Jun 26 17:38:11 IST 2012
Source timezone: sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]

convertedDateStr: 2012-06-26 11:08:11

convertedTime: Tue Jun 26 17:38:11 IST 2012
sdf:sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]

Еще несколько деталей, которыми можно поделиться. Когда я использую другой объект sdf (без установки часового пояса для него), он возвращает мне правильное время и дату, но часовой пояс по-прежнему выбирается из системных часов

Код

static Date convertGMTTime(String timeZone, long longDate){
    Date convertedTime = null;
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    SimpleDateFormat sdfParse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try{
        Date date = new Date(longDate);
        TimeZone destTimeZone = TimeZone.getTimeZone(timeZone);// TimeZone.getDefault();
        System.out.println("Source timezone: "+destTimeZone);
        sdf.setTimeZone(destTimeZone);
        String convertedDateStr = sdf.format(date);
        System.out.println("convertedDateStr: "+convertedDateStr );
        convertedTime = sdfParse.parse(convertedDateStr,new ParsePosition(0));
        System.out.println("convertedTime: "+convertedTime + "sdf: "+sdf.getTimeZone());
    }catch(Exception e){
        e.printStackTrace();
    }
    return convertedTime;
}

Выход

Source timezone: sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]

convertedDateStr: 2012-06-26 12:24:56

convertedTime: Tue Jun 26 12:24:56 IST 2012 

sdf: sun.util.calendar.ZoneInfo[id="Atlantic/Cape_Verde",offset=-3600000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]

Я понимаю, что, когда я не назначаю часовой пояс для sdf, требуется системный часовой пояс, но почему он не показывает время в системном часовом поясе? Я показываю это в часовом поясе, как это было в String, но часовой пояс отличается.

Кроме того, когда я устанавливаю часовой пояс, он возвращает объект даты в соответствии с моим системным временем, независимо от того, что в sdf установлен другой часовой пояс.

Может кто-нибудь, пожалуйста, объясните функциональное поведение для sdf.parse и sdf.format.

Для меня sdf.setTimeZone () оказывает влияние, когда мы используем формат, и аннулируется, когда мы используем sdf.parse (). Я нахожу это довольно странным.

Ценю помощь в этом отношении.

Ваш Ответ

1   ответ
7

У вас уже есть дата (или количество миллисекунд даты), поэтому преобразовывать нечего. Дата не имеет часового пояса. Это универсальный момент во времени. Часовой пояс актуален только тогда, когда выdisplay эта дата, потому что дата 65647678000 может быть 12:38 в некотором часовом поясе, но 10:38 в другом часовом поясе. Это также важно, когда выparse строковое представление даты, потому что 10:38 - 65647678000 в некотором часовом поясе, но 65657678000 - в другом.

В то время как вы не отображаете объект Date или не анализируете строку в Date, вам не нужно заботиться о часовых поясах. И чтобы выбрать часовой пояс, используемый при его отображении / разборе, установите часовой поясDateFormat, а затем использоватьDateFormat.format()/DateFormat.parse() отформатировать / разобрать дату.

Когда вы используетеDate.toString() чтобы отобразить дату, он всегда будет использовать ваш текущий часовой пояс.

Мне легче понять, что я имею в виду, не думая о Дате как о дне, месяце, году, часе и т. Д., А как о моменте: «когда Кеннеди был застрелен». "Когда Кеннеди был застрелен" это один и тот же момент для всех. Но если вы представляете момент "когда Кеннеди был застрелен" в часовом поясе Далласа это не тот результат, который вы получаете, когда представляете этот момент в часовом поясе Парижа.

Спасибо за ответ и обмен ценной информацией. Мне нужен мой метод для возврата объекта Date, как это будет в заданном часовом поясе. При использовании метода parse (String) я получаю объект Date в моем текущем часовом поясе. Мое приложение требует, чтобы пользователь установил свой часовой пояс в своем профиле, и я хочу универсальный метод, в котором я могу вернуть объект Date, как это будет в этом часовом поясе. Mayank
Вы можете использовать экземпляр Calendar, который имеет TimeZone. Или вы можете получать TimeZone в настройках пользователя каждый раз, когда вам нужно проанализировать / отобразить объект Date для этого пользователя.
Как я уже сказал, у объекта Date нет часового пояса. Вы думаете, что он есть, потому что метод toString () возвращает строку, содержащую ваш часовой пояс. Но этот часовой пояс является часовым поясом по умолчанию для JVM. Его нет в объекте Date. Вы можете использовать экземпляр Calendar, который имеет TimeZone. Или вы можете получать TimeZone в настройках пользователя каждый раз, когда вам нужно проанализировать / отобразить объект Date для этого пользователя.
Разбор строки для получения объекта Date не работает для меня, так как возвращает мне объект со временем в часовом поясе JVM (как вы сказали выше). Мне требуется объект Date со временем в часовых поясах (я понял, что у даты нет часовых поясов) для сравнения одного экземпляра времени в разных часовых поясах (например, 10:30 в IST и 10:30 в CST). Я изначально думал сделать это с помощью объекта Date. Пожалуйста, скажите мне, если это возможно. Mayank
Я понимаю тот факт, что дата - это момент времени во всех часовых поясах, и то, как мы отображаем / видим этот момент времени, меняется в зависимости от часовых поясов. Теперь я обеспокоен тем, могу ли я сохранить объект Date в определенном часовом поясе? У меня есть строка со временем, сохраненным для определенного часового пояса. Я хочу проанализировать его и получить объект Date с мгновенными деталями в соответствии с заданным часовым поясом. Не уверен, если это возможно, для меня это всегда дает мне объект даты в моем часовом поясе системы. Любая помощь / работа по достижению высоко ценится. Mayank

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