Удалить секунды из ответа API, используя Java - PullRequest
1 голос
/ 18 марта 2019

В коде ниже.Струнная ул;это ответ от API.Так что я не могу это изменить.Но я хочу удалить часть секунд из этого.В противном случае мне придется отправлять запрос в этот API каждую секунду, чтобы обновлять мой виджет времени.Я также связывался с разработчиками API, если есть какой-либо параметр для получения метки времени в определенном формате.Они сказали, что нет.

Main() {
    //assume that timestamp reply from the API is being stored in 'str'
    //now we've to remove :55 from str
    String str = "Mon, 18 Mar 2019 03:43:55 GMT";
    Date date=null;
    try {
        date=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm z").parse(str);
    } 
    catch (ParseException e) {
        e.printStackTrace();
    }
}

Получение исключения: Неопределяемая дата

java.text.ParseException: Unparseable date: "Mon, 18 Mar 2019 03:43:55 GMT"
at java.text.DateFormat.parse(Unknown Source)
at Main.<init>(Main.java:9)
at Main.main(Main.java:17)

Ответ службы поддержки API:

Это не вопрос геокодирования, но есть два способа разобрать дату.1. используйте регулярное выражение.2. Вы, возможно, заметили, что в разделе «отметка времени» есть также create_unix, который содержит unixtime.Я понятия не имею, какой язык программирования вы используете, но я уверен, что есть стандартные модули для преобразования unixtime в любой формат, который вы хотели бы

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

Я не знаю, является ли ваша конечная цель на самом деле сгенерировать объект даты с удаленным компонентом секунд, или вы просто хотите изменить представление вашей метки времени, чтобы удалить компонент секунд. Для последнего требования здесь может подойти простая замена регулярного выражения:

String str = "Mon, 18 Mar 2019 03:43:55 GMT";
str = str.replaceAll("(?<=\\d):\\d{2}(?=\\s)", "");
System.out.println(str);

Mon, 18 Mar 2019 03:43 GMT
0 голосов
/ 18 марта 2019

java.time и правильный объект datetime, а не строка

Внутренне в вашей программе не представляйте момент времени в виде строки. Используйте правильный объект даты и времени. Разобрать строку, чтобы получить одну:

    String str = "Mon, 18 Mar 2019 03:43:55 GMT";

    // Parse for internal use
    Instant when = DateTimeFormatter.RFC_1123_DATE_TIME.parse(str, Instant::from);
    System.out.println(when);

2019-03-18T03: 43: 55Z

Строка, которую вы получили от API, представлена ​​в стандартном формате RFC 1123 / RFC 822 (который включает в себя секунды, и они правильны, поскольку не допускают нарушения стандарта (хотя формат ISO 8601 мог бы быть даже более подходящим) )). Парсер для формата RFC 1123 / RFC 822 встроен в java.time, что избавляет нас от необходимости конструировать его самостоятельно из строки шаблона формата.

Я предположил, что момент времени является важной информацией здесь, и выбросил информацию, которая была передана в GMT (то же самое произошло в вашем коде в вопросе). Если смещение стоит сохранить, нам нужен OffsetDateTime вместо Instant, и тот же встроенный форматер по-прежнему работает:

    OffsetDateTime whenWithOffset
            = OffsetDateTime.parse(str, DateTimeFormatter.RFC_1123_DATE_TIME);
    System.out.println(whenWithOffset);

2019-03-18T03: 43: 55Z

Трейлинг Z на выходе означает UTC, что на практически совпадает с GMT (теоретическая разница меньше секунды).

Я полагаю, что секунды, о которых вы спрашивали, не повредят вашей программе. Я предполагаю, что вы только хотите избежать представления их вашему пользователю. В случае, если я ошибаюсь, убрать секунды легко, когда вы знаете, как:

    Instant when = DateTimeFormatter.RFC_1123_DATE_TIME.parse(str, Instant::from)
            .truncatedTo(ChronoUnit.MINUTES);

2019-03-18T03: 43: 00Z

Теперь для секунд установлено значение 0. truncatedTo можно использовать таким же образом с OffsetDateTime.

Предоставление пользователю в часовом поясе и локали пользователя без секунд

Я полагаю, что ваш пользователь хотел бы видеть дату и время без секунд в своем часовом поясе и в формате, обычном для его или ее культуры. Например:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
                    .withLocale(Locale.forLanguageTag("en-IN"));
    ZonedDateTime whenInUsersTimeZone = when.atZone(ZoneId.of("Asia/Kolkata"));
    String formatted = whenInUsersTimeZone.format(formatter);
    System.out.println(formatted);

18/03/19, 9:13

Вы заметили:

  • Время было преобразовано с 03:43 (GMT) в 09:13 (стандартное время Индии).
  • Даже если время в вашей программе содержит секунды, они не отображаются.

Если вы хотите использовать язык форматирования JVM по умолчанию, используйте .withLocale(Locale.getDefault(Locale.Category.FORMAT)) (опускание этой части также полностью работает, но я предпочитаю явно указать, что мы полагаемся на значение по умолчанию). Если вы хотите использовать часовой пояс по умолчанию, используйте when.atZone(ZoneId.systemDefault()).

Избегайте даты и SimpleDateFormat

Используемые вами классы даты и времени Date и SimpleDateFormat плохо разработаны и давно устарели. Вместо этого я использую java.time, современный Java-интерфейс даты и времени. Мне так приятнее работать.

Ссылка

Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

0 голосов
/ 18 марта 2019

Это должно работать для этого примера;Я не знаю, хотите ли вы универсальную версию для любой временной метки - это было бы возможно, но немного сложнее.

Main() {
    //assume that timestamp reply from the API is being stored in 'str'
    //now we've to remove :55 from str
    String str = "Mon, 18 Mar 2019 03:43:55 GMT";
    str = str.replace(":55", "");

    Date date=null;
    try {
        date=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm z").parse(str);
    } 
    catch (ParseException e) {
        e.printStackTrace();
    }
}
...