Разбор даты и времени в Java - PullRequest
3 голосов
/ 09 марта 2011

У меня есть формат времени в (гггг-мм-ддтчч: мм + 0: 0000) .. мне нужно преобразовать этот формат в мм-дд-гггг чч: мм утра / вечера с помощью Java-программы ... любая помощьмне сделать это .. спасибо заранее ...

Ответы [ 6 ]

9 голосов
/ 09 марта 2011

Попробуйте что-то вроде этого:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm+s:SSSS");
Date date = format.parse(dateString);
format = new SimpleDateFormat("MM-dd-yyyy hh:mm a");
dateString = format.format(date);
2 голосов
/ 05 июля 2017

Вот современный ответ. SimpleDateFormat был правильным ответом в 2011 году, когда был задан вопрос, но это уже не так. Старые классы оказались проблематичными, поэтому в конце 2014 года их замены появились в начале 2014 года.

Я был немного озадачен парой деталей в ваших форматах.

  • yyyy-mm-ddTHH:mm+0:0000 выглядит немного как дата-время смещения ISO 8601, но тогда +0:0000 должно быть смещением от UTC. Я предполагаю, что он мог быть задуман как смещение в формате h:mmss, но это нестандартно и ничего такого, чего я не видел в других местах.
  • Вы, кажется, спрашиваете am / pm в нижнем регистре. Это тоже нестандартно и не встроено в стандартные классы.

Я предлагаю:

    DateTimeFormatter sourceFormat
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm'+0:0000'");
    DateTimeFormatter targetFormat
            = DateTimeFormatter.ofPattern("MM-dd-uuuu hh:mm a", Locale.ENGLISH);

    String sourceTime = "2017-07-05T20:31+0:0000";
    String convertedTime = LocalDateTime.parse(sourceTime, sourceFormat)
            .format(targetFormat)
            .toLowerCase(Locale.ENGLISH);

    System.out.println(convertedTime);

Это печатает

07-05-2017 08:31 pm

Я считаю, что безопаснее всего просто вводить буквально +0:0000 на входе, не пытаясь его интерпретировать. Для получения pm в нижнем регистре я преобразовал всю строку в нижний регистр после форматирования. В этом ответе есть другая хитрость .

Попытка быть более гибкой с часами, минутами и секундами в смещении и иметь смысл их может быть:

    sourceTime = sourceTime.replaceFirst("(\\d:\\d{2})(\\d{2})$", "0$1:$2");
    String convertedTime = OffsetDateTime.parse(sourceTime)
            .format(targetFormat)
            .toLowerCase(Locale.ENGLISH);

replaceFirst преобразует 0:0000 в 00:00:00, что при предшествующем + или - соответствует смещению ISO 8601. Это будет работать и с другими смещениями (если час - одна цифра; вы можете попробовать поочередно одну и две цифры). В конкретном коде мы все еще игнорируем смещение при форматировании, но при желании его можно использовать для других целей.

DateTimeFormatter, LocalDateTime и OffsetDateTime являются частью JSR-310. Они встроены в Java 8 и позже. Вы также можете использовать их в Java 6 и 7 через ThreeTen Backport . Существует также специальная версия бэкпорта для Android: ThreeTenABP .

2 голосов
/ 09 марта 2011

Посмотрите на java.text.SimpleDateFormat - вам понадобятся два экземпляра, один для разбора, один для форматирования.

1 голос
/ 09 марта 2011

Смотрите рабочий пример с этим фрагментом кода:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTimeAMPM {
    public static void main(String[] args) throws ParseException {

DateFormat inputDateFormatter = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm+s:SSSS");
Date date = inputDateFormatter.parse("2011-11-11T22:33+0:400");
String outputDateFormatter = "MM-dd-yyyy HH:mm:ss a";
SimpleDateFormat sdf = new SimpleDateFormat(outputDateFormatter);
System.out.println("Date: " + sdf.format(date));
}

}

0 голосов
/ 09 марта 2011

Вы должны создать объект Data из вашей строки -> использовать соответствующий класс (например, SimpleDataFormat ), а затем распечатать его в другом формате.

0 голосов
/ 09 марта 2011

Вы можете делать то, что говорят Пауло и Моря, или просто использовать String.substring (), поскольку ваши требования разбора очень просты.

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