Почему дата Java не анализируется?

Я разрабатываю мобильное приложение с использованием oracle MAF. Oracle MAF предоставляет свой компонент даты, и если я выберу дату, вывод будет выглядеть так: 2015-06-16T04:35:00.000Z для выбранной даты Jun 16, 2015 10:05 AM.

Я пытаюсь преобразовать этот формат в «Индийское стандартное время» с .ical (формат даты ICalendar), который должен быть похож на 20150613T100500 для выбранной даты Jun 16, 2015 10:05 AM. Я использую код ниже:

SimpleDateFormat isoFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
isoFormat.setTimeZone(TimeZone.getTimeZone("IST"));
String start_date_time = isoFormat.parse("20150616T043500000Z").toString();

Но он возвращает дату и время как:

Tue Jun 16 04:35:00 GMT+5:30 2015

А должно быть так:

20150616T100500

person Himanshu    schedule 16.06.2015    source источник
comment
Как шаблон yyyyMMdd'T'HHmmss соответствует значению 2015-06-16T04:35:00.000Z? Может быть, что-то вроде yyyy-MM-dd'T'HH:mm:ss.SSSSZ может сработать   -  person MadProgrammer    schedule 16.06.2015
comment
Для формата yyyyMMdd'T'HHmmss вам нужно использовать 20150613T100500 в качестве значения для анализа.   -  person MadProgrammer    schedule 16.06.2015
comment
Благодаря устраненному исключению, я использовал 20150616T043500000Z в качестве строки, но он возвращает вторник, 16 июня, 04:35:00 GMT+5:30 2015, как преобразовать в плитку, например 20150613T100500 , и почему время отображается как 04:35, а Я прохожу время как 10:05.   -  person Himanshu    schedule 16.06.2015
comment
Исходное значение находится в формате UTC, поэтому при его анализе необходимо убедиться, что вы используете UTC в качестве часового пояса. Когда вы форматируете его, вы хотите использовать IST   -  person MadProgrammer    schedule 16.06.2015
comment
String start_date_time = isoFormat.parse("20150616T043500000Z").toString(); неверно, это полагается на внутренний формат Date для обеспечения String представления объекта, он не несет внутренней концепции форматирования. Вместо этого используйте SimpleDateFormat для форматирования проанализированного значения Date.   -  person MadProgrammer    schedule 16.06.2015


Ответы (3)


Вам нужно проанализировать значение от 2015-06-16T04:35:00.000Z UTC до java.util.Date

SimpleDateFormat from = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
from.setTimeZone(TimeZone.getTimeZone("UTC"));
Date start_date_time = from.parse("2015-06-16T04:35:00.000Z");

Что дает нам java.util.Date из Tue Jun 16 14:35:00 EST 2015 (для меня).

Затем вам нужно отформатировать это в IST

SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
outFormat.setTimeZone(TimeZone.getTimeZone("IST"));
String formatted = outFormat.format(start_date_time);
System.out.println(formatted);

Что выводит 20150616T100500

API времени Java 8

Просто потому, что это хорошая практика...

    // No Time Zone
    String from = "2015-06-16T04:35:00.000Z";
    LocalDateTime ldt = LocalDateTime.parse(from, DateTimeFormatter.ISO_ZONED_DATE_TIME);
    
    // Convert it to UTC
    ZonedDateTime zdtUTC = ZonedDateTime.of(ldt, ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC"));

    // Convert it to IST
    ZonedDateTime zdtITC = zdtUTC.withZoneSameInstant(ZoneId.of("Indian/Cocos"));
    String timestamp = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss").format(zdtITC);
    System.out.println(timestamp);

NB: если я не проанализировал значение до LocalDateTime, а затем преобразовал его в UTC, я отстал на час, но я готов узнать лучшие способы

person MadProgrammer    schedule 16.06.2015

Формат поставки должен быть "yyyy-MM-dd'T'HH:mm:ss"

public static void main(String[] args) {
    SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    isoFormat.setTimeZone(TimeZone.getTimeZone("IST"));
    try {
        Date start_date_time = isoFormat.parse("2015-06-16T04:35:00.000Z");
        System.out.println(start_date_time);
        SimpleDateFormat output = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
        String formattedTime = output.format(start_date_time);
        System.out.println(formattedTime);
    } catch (ParseException e) {
        e.printStackTrace();
    }
}

Вывод

Tue Jun 16 04:35:00 IST 2015
20150616T043500
person Ankur Singhal    schedule 16.06.2015
comment
Разве это не должно выходить как 20150616T100500? - person MadProgrammer; 16.06.2015
comment
10:05 не 04:35, но да, значения дат в исходном посте перепутаны :P - person MadProgrammer; 16.06.2015

Несколько дополнений к формату и правильный TZ в строке даты:

 SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz");
 isoFormat.setTimeZone(TimeZone.getTimeZone("IST"));
 String start_date_time = isoFormat.parse("2015-06-16T04:35:00.000CEST").toString();
person laune    schedule 16.06.2015