Преобразование даты, возвращенной из монго, в этот формат 2015-10-25

У меня есть файл json, возвращенный из mongo db следующим образом:

[
{
    "_id": {
        "$date": "2014-10-19T04:00:00.000Z"
    },
    "value": 29
},
{
    "_id": {
        "$date": "2014-10-20T04:00:00.000Z"
    },
    "value": 20
},
{
    "_id": {
        "$date": "2014-10-21T04:00:00.000Z"
    },
    "value": 21
}
]

Теперь я хочу прочитать дату в java в следующем формате: 2014/10/25

но когда я использую:

System.out.println("DAte is : "+result.get("_id").toString() );

результат:

DAte is : Sun Oct 19 01:00:00 ADT 2014

Тогда единственное, что приходит мне в голову, это использовать подстроку и вручную преобразовать дату в 2014-10-25, но я уверен, что есть лучший способ. Есть ли у кого-нибудь идеи?

Обновлять :

Вот ответ:

преобразование даты из одного формата в другой не работает

большое спасибо за помощь


person Hamed Minaee    schedule 06.01.2015    source источник
comment
Дата, возвращаемая MongoDB, представляет собой ISODate, см. связанный вопрос: stackoverflow.com/questions/2201925/   -  person BatScream    schedule 06.01.2015


Ответы (3)


Почему бы вам не использовать DateTimeFormatter? Затем вы можете проанализировать свои даты следующим образом:

// The test string
String str = "Sun Oct 19 01:00:00 ADT 2014";

// Formatter for the input date
final DateTimeFormatter inputFormat = 
        DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy");

// The parsed date
final ZonedDateTime parsed = ZonedDateTime.parse(str, inputFormat);

// The output format(s). Specify the one you need
final DateTimeFormatter outputFormat1 = DateTimeFormatter.ofPattern("yyyy/MM/dd");
final DateTimeFormatter outputFormat2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");

// Print
System.out.println(outputFormat1.format(parsed)); // -> 2014/10/19
System.out.println(outputFormat2.format(parsed)); // -> 2014-10-19

В этой статье содержится полезная информация о том, как анализировать и форматировать даты. . Класс DateTimeFormatter доступен для Java 8, если вы используете более старые версии Java, вместо него можно использовать класс SimpleDateFormat (он использует аналогичную стратегию для обработки дат, но, к сожалению, не является потокобезопасным).

Редактировать: обновлен модуль форматирования после ввода из OP.

person wassgren    schedule 06.01.2015
comment
когда я использую эту строку final LocalDateTime parsed = LocalDateTime.parse(result.get(_id).toString() , inputFormat); я получаю следующую ошибку: Текст «Sun Oct 19 01:00:00 ADT 2014» не может быть проанализирован по индексу 0 - person Hamed Minaee; 06.01.2015
comment
кажется, что json возвращает дату в следующем формате: воскресенье, 19 октября, 01:00:00 ADT 2014 - person Hamed Minaee; 06.01.2015
comment
Хорошо, тогда вы можете использовать следующий шаблон для inputFormatter: EEE MMM dd HH:mm:ss zzz yyyy. У меня сложилось впечатление (из предоставленного вами файла), что дата ввода выглядит так: 2014-10-21T04:00:00.000Z. - person wassgren; 06.01.2015
comment
Вы уверены, что он будет работать с этим вс 19 октября 01:00:00 ADT 2014, потому что я получаю ту же ошибку! - person Hamed Minaee; 06.01.2015
comment
Можете ли вы опубликовать трассировку стека? - person wassgren; 06.01.2015
comment
Вы имеете в виду следующее: Исключение в потоке main java.time.format.DateTimeParseException: текст «Вс, 19 октября, 01:00:00 ADT 2014» не может быть проанализирован с индексом 0 в java.time.format.DateTimeFormatter.parseResolved0 (DateTimeFormatter. java:1947) в java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849) в java.time.LocalDateTime.parse(LocalDateTime.java:492) - person Hamed Minaee; 06.01.2015
comment
Даже если я не использую json и вместо этого использую это, я получу ту же ошибку: final LocalDateTime parsed = LocalDateTime.parse (Sun Oct 19 01:00:00 ADT 2014, inputFormat); - person Hamed Minaee; 06.01.2015
comment
Затем я получаю эту ошибку. - person Hamed Minaee; 06.01.2015
comment
Почему вы используете LocalDateTime, когда дата включает часовой пояс? Разве ZonedDateTime не будет лучшим выбором? - person David Conrad; 06.01.2015
comment
Ответ здесь, большое спасибо всем за помощь: stackoverflow.com/questions/27805732/ - person Hamed Minaee; 06.01.2015
comment
минимальный уровень API 26 - person DragonFire; 23.05.2020

Вы можете использовать этот метод для анализа формата даты монго. Но здесь мы пренебрегаем часовым поясом. Так что используйте это, если часовой пояс не имеет значения.

private static String convertMongoDate(String val){
    SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    SimpleDateFormat outputFormat= new SimpleDateFormat("yyyy/MM/dd");
    try {
        String finalStr = outputFormat.format(inputFormat.parse(val));
        System.out.println(finalStr);
        return finalStr;
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return "";
}
person thilina Kj    schedule 23.07.2017
comment
У меня это отлично сработало, например: 2018-02-06T20:52:04.424Z - person Norris Boateng; 25.02.2018

Я бы предложил вам сделать что-то вроде ниже.

SimpleDateFormat original = new SimpleDateFormat("yyyy-MM-ddThh:mm:sssZ");
SimpleDateFormat output= new SimpleDateFormat("yyyy/MM/dd");
String isoFormat = original.format(result.get("_id"));
Date d = original.parse(isoFormat);
String formattedTime = output.format(d);

System.out.println(formattedTime);
person dReAmEr    schedule 06.01.2015
comment
Проблема в том, что дата, возвращаемая из json, выглядит следующим образом: Sun Oct 19 01:00:00 ADT 2014, и именно на этой строке я застрял: Date d = original.parse(result.get(_id)); - person Hamed Minaee; 06.01.2015
comment
я обновил свой ответ, который должен справиться с этим случаем, можете ли вы проверить это? - person dReAmEr; 06.01.2015
comment
Не работает. Я получаю эту ошибку: Исключение в потоке main java.lang.IllegalArgumentException: недопустимый символ шаблона «T» - person Hamed Minaee; 06.01.2015
comment
@HamedMinaee: вместо этого вы можете использовать новый SimpleDateFormat (yyyy-MM-dd'T'hh:mm:sss). - person mam10eks; 10.04.2017