1

我想解析以下类型的日期:

2010-07-13T17:27:00.000Z

我如何在java中使用简单的日期格式化程序来做到这一点?要使用什么格式?

4

3 回答 3

5
  1. 查看SimpleDateFormat 的 javadocs
  2. 在构造函数中使用适当的 String 创建此类的实例
  3. 调用它的parse方法,在你的问题中传入字符串
  4. ???
  5. 利润!

(您可能会注意到我实际上并没有给您格式字符串。这是一个“教人钓鱼”的答案。如果您在具体制定特定部分需要使用的内容时遇到问题请随意详细说明,说明您尝试了什么以及为什么它不起作用。但现在听起来您还没有到尝试任何特定格式字符串的地步。Javadocs 编写得相当好,包含您需要的一切。能够从文档中提取信息对于程序员来说是一项非常重要的技能,我不会剥夺你改进它的机会。)

于 2010-07-16T14:44:11.803 回答
1

该代码应类似于以下代码。

对于您的日期字符串“ 2010-07-13T17:27:00.000Z”,您可以尝试这种格式“ yyyy-MM-dd'T'hh:mm:ss.S'Z'”。

我假设您的日期字符串中的“T”和“Z”只是常量/分隔符。

import java.text.SimpleDateFormat;
import java.util.Date;

public class TestMain {

    public static void main(String[] args) throws Exception{

        String fromDateTime = "2010-12-01 00:01:23";
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
        Date date = null;

        date = format.parse(fromDateTime);
        //What ever you want to manipulate of this date object
        //... 

    }
}

编辑:添加适当的类、方法和注释以使其成为一个完整的程序。感谢@Andrzej Doyle 的评论。编辑:从演示程序中删除 throws IOException。感谢@BalusC。编辑:重新阅读评论,了解@BalusC 的全部含义 :)

于 2010-07-16T15:12:42.797 回答
1

日期时间字符串,2010-07-13T17:27:00.000Z符合ISO 8601日期时间模式。在此字符串中,T是日期和时间的分隔符,Z代表 Zulu,它指定 UTC(即时区偏移量+00:00)。解析此日期时间字符串所需的格式如下:

yyyy-MM-dd'T'HH:mm:ss.SSSX 

在文档页面了解有关该模式的更多信息。

请注意,旧的日期时间 API(java.util日期时间类型及其格式化 API SimpleDateFormat)已过时且容易出错。建议完全停止使用它们并切换到java.time现代日期时间 API *

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
import java.util.Date;
import java.util.TimeZone;

public class Main {
    public static void main(String args[]) throws ParseException {
        String strDateTime = "2010-07-13T17:27:00.000Z";

        Instant instant = Instant.parse(strDateTime);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime);

        System.out.println(instant);
        System.out.println(zdt);
        System.out.println(odt);

        // #################Using legacy API####################
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
        Date date = sdf.parse(strDateTime);
        // Default format
        System.out.println(date);
        // Custom format
        sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        System.out.println(sdf.format(date));
        // #####################################################
    }
}

输出:

2010-07-13T17:27:00Z
2010-07-13T17:27Z
2010-07-13T17:27Z
Tue Jul 13 18:27:00 BST 2010
2010-07-13T17:27:00.000Z

请注意,现代日期时间中的默认模式遵循 ISO 8601 标准,并且您不需要显式地使用DateTimeFormatter(现代日期时间 API 中的对应物SimpleDateFormat)来解析 ISO 8601 日期时间字符串。从Trail: Date Time了解有关现代日期时间 API 的更多信息。

这里要提到的另一点重要的是java.util.Date对象不是像现代日期时间类型那样的真实日期时间对象;相反,它表示自称为“纪元” January 1, 1970, 00:00:00 GMT(或 UTC)的标准基准时间以来的毫秒数。当您打印 的对象时java.util.Date,其toString方法会返回 JVM 时区中的日期时间,根据此毫秒值计算得出。如果您需要在不同的时区打印日期时间,则需要将时区设置为SimpleDateFormat并从中获取格式化字符串。


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

于 2021-04-28T19:21:27.190 回答