【问题标题】:How to take out only the time from 019-01-04T18:30:00.000Z in java如何在java中仅取出019-01-04T18:30:00.000Z的时间
【发布时间】:2021-10-12 16:15:43
【问题描述】:

我使用的 API 以这种格式 019-01-04T18:30:00.000Z 提供开始时间,那么如何在 java 中仅从这种开始时间格式中提取时间?

【问题讨论】:

  • 让我猜猜,2 不见了?应该是2019-01-04T18:30:00.000Z?大约两年半前。
  • 您的字符串采用 UTC 格式(由结尾的 Z 表示)。您想要 UTC 时间、您自己的时区还是其他时区?哪一个?您的个人资料显示您在印度,因此您所在时区的时间将是 00:00:00(几乎没有巧合)。
  • 欢迎来到 Stack Overflow。请了解您应该在此处提问之前进行搜索,当您发布问题时,请告诉我们您的搜索结果并说明它如何未能解决您的问题。这是为您自己着想,因为 (1) 您通常可以更快地找到更好的答案 (2) 它使我们能够提供更精确和更有针对性的答案。我投了反对票,因为您的问题中没有记录任何研究工作(我很想知道为什么有人投了赞成票)。
  • @OleV.V.抱歉给您带来的不便将在未来牢记这一点,同时也考虑到我正在使用 Rest API 的 java 中制作一个 android 应用程序的上下文,它以这种格式给出日期/时间,即“2021-08-24T14:35 :00.000Z" 我能够使用 DateTimeFormatter 类从该字符串中提取 dd/mm/yy ,但无法从该字符串中提取时间,我什至在不同站点上搜索了解决方案但无法获得代码的最新更新版本。 API 链接:-kontests.net/api

标签: java android api date time


【解决方案1】:

您的日期时间字符串似乎不正确。

您需要将您的日期时间字符串解析为一个日期时间对象,您可以从中提取时间部分。

以下是使用现代日期时间 API java.time 的解决方案:

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

ONLINE DEMO

通过 Trail: Date Time 了解有关 modern Date-Time API* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

【讨论】:

    【解决方案2】:

    java.time 脱糖

    使用现代 Java 日期和时间 API java.time 进行时间工作。我可以很容易地给你代码。我希望你不会对它的结果感到失望。

    您的字符串标识了一个时间点。那时,一天中的时间因时区而异。所以你需要决定你想要的时间在哪个时区。例如:

        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 是内置的。
    • 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
    • 在较旧的 Android 上,请使用脱糖或 Android 版本的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-19
      • 2020-01-19
      • 2018-09-12
      • 2011-06-02
      • 1970-01-01
      • 2017-05-24
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多