Как вынести только время с 019-01-04T18:30:00.000Z в java

avatar
NEELANGSHU NATH
8 августа 2021 в 19:29
66
2
0

Я использую API, который выдает время начала в формате 019-01-04T18:30:00.000Z, так как же мне извлечь только время из этого формата времени начала в java?

Источник
Ole V.V.
8 августа 2021 в 19:53
0

Дай угадаю, не хватает 2? Должно было быть 2019-01-04T18:30:00.000Z? Примерно два с половиной года назад.

Ole V.V.
8 августа 2021 в 19:54
1

Ваша строка находится в формате UTC (обозначается буквой Z в конце). Вы хотите, чтобы время суток было в формате UTC, в вашем часовом поясе или в другом часовом поясе? Который из? В вашем профиле указано, что вы находитесь в Индии, поэтому время в вашем часовом поясе будет 00:00:00 (совпадений почти нет).

Ole V.V.
8 августа 2021 в 20:21
0

Добро пожаловать в Stack Overflow. Пожалуйста, узнайте, что вы должны искать, прежде чем задавать вопрос здесь, и когда вы публикуете вопрос, сообщите нам, что выдал ваш поиск, и укажите, почему он не помог решить вашу проблему. Это делается для вашего же блага, поскольку (1) так вы часто найдете лучший ответ быстрее (2) это позволяет нам давать более точные и целенаправленные ответы. Я проголосовал против, потому что в вашем вопросе не задокументировано никаких исследований (и я серьезно удивляюсь, почему кто-то проголосовал за).

NEELANGSHU NATH
10 августа 2021 в 19:01
1

@ОлеВ.В. извините за неудобства, буду помнить об этом в будущем, а также в контексте. Я делаю приложение для Android в java, которое использует Rest API, и оно дает дату/время в этом формате, т.е. "2021-08-24T14:35 :00.000Z" Мне удалось извлечь дд/мм/гг из этой строки с помощью класса DateTimeFormatter, но мне не удалось извлечь время из этой строки, я даже искал решение на другом сайте, но не смог получить последняя обновленная версия кодов. ССЫЛКА на API:-kontests.net/api

Ответы (2)

avatar
Ole V.V.
8 августа 2021 в 20:16
0

java.time через дешугаринг

Используйте java.time, современный API даты и времени Java, для своей работы. Я могу легко дать вам код. Надеюсь, вы не будете разочарованы результатом.

Ваша строка определяет момент времени. В этот момент время суток отличается от часового пояса к часовому поясу. Поэтому вам нужно решить, в каком часовом поясе вы хотите время. Например:

    ZoneId zone = ZoneId.of("Asia/Kolkata");
    
    String startTimeString = "2019-01-04T18:30:00.000Z";
    ZonedDateTime dateTime = Instant.parse(startTimeString).atZone(zone);
    System.out.println("Date and time: " + dateTime);
    LocalTime time = dateTime.toLocalTime();
    System.out.println("Time:          " + time);

Вывод:

Date and time: 2019-01-05T00:00+05:30[Asia/Kolkata]
Time:          00:00

Ваш пример строки обозначает начало дня в Индии. Конечный Z в полученной строке говорит нам о том, что строка указана в формате UTC, что является стандартом для обмена данными о дате и времени, особенно между часовыми поясами. Вызов atZone() преобразуется в ваш часовой пояс.

Если вы действительно получаете строку без первой цифры, 2, сначала посмотрите, можно ли исправить эту ошибку. Если вы не можете, просто добавьте 2 самостоятельно. Если вы не считаете возможным получение времени до 2000 года (или после 2999 года).

Я разбираю вашу строку без указания какого-либо средства форматирования. Я могу это сделать, потому что ваша строка на мгновение находится в формате по умолчанию. Формат известен как ISO 8601.

Вопрос. Разве для java.time не требуется Android API уровня 26?

java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6.

  • В Java 8 и более поздних версиях, а также на более новых устройствах Android (начиная с уровня API 26) современный API встроен.
  • В версиях Java 6 и 7, отличных от Android, используйте ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. ссылки внизу).
  • На старых версиях Android используйте либо дешугаринг, либо версию ThreeTen Backport для Android. Он называется ThreeTenABP. В последнем случае убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

avatar
Arvind Kumar Avinash
8 августа 2021 в 19:37
1

Ваша строка даты и времени неверна.

Вам необходимо преобразовать строку даты и времени в объект даты и времени, из которого можно извлечь часть времени.

Ниже приведено решение, использующее java.time, современный API даты и времени:

import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "019-01-04T18:30:00.000Z";
        DateTimeFormatter dtfInput = DateTimeFormatter.ofPattern("u-M-d'T'H:m:s.SSSX", Locale.ENGLISH);
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime, dtfInput);
        LocalTime time = odt.toLocalTime();
        System.out.println(time);

        // As a string
        String strTime = time.toString();
        System.out.println(strTime);

        // As a string in a custom format
        DateTimeFormatter dtfOutput = DateTimeFormatter.ofPattern("HH:mm:ss.SSS", Locale.ENGLISH);
        String formattedTime = time.format(dtfOutput);
        System.out.println(formattedTime);
    }
}

Вывод:

18:30
18:30
18:30:00.000

ОНЛАЙН ДЕМО

Learn more about the modern Date-Time API* from Trail: Date Time.


* По любой причине, если вам нужно придерживаться Java 6 или Java 7, вы можете использовать threeten-backport <3425555555252525272.тир. функции java.time на Java 6 и 7. Если вы работаете над проектом Android и ваш уровень Android API по-прежнему не соответствует Java-8, проверьте Java 8+ API, доступные через desugaring и Как использовать ThreeTenABP в Android Project.