java中的简单日期格式化程序问题

时间:2010-07-16 14:42:13

标签: java datetime simpledateformat

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

2010-07-13T17:27:00.000Z

我如何在java中使用简单的日期格式化程序?使用什么格式?

3 个答案:

答案 0 :(得分:5)

  1. 查看javadocs of SimpleDateFormat
  2. 使用构造函数中的相应String
  3. 创建此类的实例
  4. 调用其parse方法,传入问题中的字符串
  5. ???
  6. 利润!
  7. (你可能会注意到我实际上并没有给你格式字符串。这是一个“教人钓鱼”的答案。如果你有问题具体你需要什么用于特定部分,然后随意详细说明,说明你尝试了什么以及它为什么不起作用。但是现在听起来你还没有尝试任何特定的格式字符串.Javadocs是合理的精心编写并包含您需要的一切。能够从文档中提取信息对于程序员来说是一项非常重要的技能,我不会让您有机会改进它。)

答案 1 :(得分: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的评论。 编辑:从演示程序中删除抛出IOException。感谢@BalusC。 编辑:重新阅读评论,得到@BalusC的全部含义:)

答案 2 :(得分:1)

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

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

documentation page 上了解有关该模式的更多信息。

请注意,旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已过时且容易出错。建议完全停止使用它们并切换到 java.timemodern date-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 对象不是像 modern date-time types 那样的真实日期时间对象;相反,它表示自称为“纪元”的标准基准时间以来的毫秒数,即 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 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project