【问题标题】:How to parse a date? [duplicate]如何解析日期? [复制]
【发布时间】:2010-11-03 04:56:25
【问题描述】:

我正在尝试使用 SimpleDateFormat 解析此日期,但它不起作用:

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

public class Formaterclass {
    public static void main(String[] args) throws ParseException{
        String strDate = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Date dateStr = formatter.parse(strDate);
        String formattedDate = formatter.format(dateStr);
        System.out.println("yyyy-MM-dd date is ==>"+formattedDate);
        Date date1 = formatter.parse(formattedDate);

        formatter = new SimpleDateFormat("dd-MMM-yyyy");
        formattedDate = formatter.format(date1);
        System.out.println("dd-MMM-yyyy date is ==>"+formattedDate);
    }
}

如果我使用 strDate="2008-10-14" 尝试此代码,我会得到肯定的答案。有什么问题?如何解析这种格式?

PS。我从jDatePicker 获得了这个日期,并且没有关于如何修改用户选择日期时获得的日期格式的说明。

【问题讨论】:

标签: java date simpledateformat


【解决方案1】:

您不能期望使用设置为不同格式的 SimpleDateFormat 来解析日期。

要解析您的“Thu Jun 18 20:56:02 EDT 2009”日期字符串,您需要这样的 SimpleDateFormat(大致):

SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");

使用它将字符串解析为日期,然后您的其他 SimpleDateFormat 将该日期转换为您想要的格式。

        String input = "Thu Jun 18 20:56:02 EDT 2009";
        SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
        Date date = parser.parse(input);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = formatter.format(date);

        ...

JavaDoc:http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

【讨论】:

  • 有同样的问题......它在Java7上运行良好,但在Java6中将“Thu Jun ...”解析为“EEE MMM ...”失败。有什么想法吗?
  • eventuell new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy",Locale.ENGLISH);如果当前语言环境 != ENGLISH 可能需要
  • @jwl 如何分配Sun Dec 06 11:15:00 IST 2015 这个日期
  • 如果Locale 更改无法在4.4 and 5.1 设备上解析怎么办
  • 请注意,SimpleDateFormat 在默认情况下或通过调用setTimeZone 方法配置有TimeZone。在解析期间使用该时区当且仅当在要解析的字符串中未指示时区。
【解决方案2】:

问题是您的日期格式如下:

Thu Jun 18 20:56:02 EDT 2009

但是使用的是SimpleDateFormat,即:

yyyy-MM-dd

这两种格式不一致。您需要构造一个SimpleDateFormat,它与您尝试解析为日期的字符串的布局相匹配。排列起来以便于查看,您想要这样的SimpleDateFormat

EEE MMM dd HH:mm:ss zzz yyyy
Thu Jun 18 20:56:02 EDT 2009

检查我链接到的 JavaDoc 页面,看看这些字符是如何使用的。

【讨论】:

  • @eddie 如何将Sun Dec 06 11:15:00 IST 2015 日期转为dd mm yy
  • 如果区域设置更改无法在 4.4 和 5.1 设备上解析怎么办
【解决方案3】:

我们现在有一种更现代的方式来完成这项工作。

java.time

java.time 框架与 Java 8 及更高版本捆绑在一起。见Tutorial。这些新类的灵感来自Joda-Time,由JSR 310 定义,并由ThreeTen-Extra 项目扩展。它们是对麻烦的旧类 java.util.Date/.Calendar 等的巨大改进。

请注意,像 EDT 这样的 3-4 个字母代码既不是标准化的也不是唯一的。尽可能避免使用它们。学习改用ISO 8601 标准格式。 java.time 框架可能会在翻译方面有所尝试,但许多常用代码都有重复值。

顺便说一下,请注意 java.time 默认如何使用 ISO 8601 格式生成字符串,但通过在括号中附加时区名称来扩展。

String input = "Thu Jun 18 20:56:02 EDT 2009";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH );
ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from );

转储到控制台。

System.out.println ( "zdt : " + zdt );

运行时。

zdt : 2009-06-18T20:56:02-04:00[美国/纽约]

调整时区

为了好玩,让我们适应印度时区。

ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );

zdt加尔各答:2009-06-19T06:26:02+05:30[亚洲/加尔各答]

转换为 j.u.Date

如果您确实需要一个 java.util.Date 对象来与尚未更新为 java.time 类型的类一起使用,请转换。请注意,您失去了分配的时区,但同一时刻会自动调整为UTC

java.util.Date date = java.util.Date.from( zdt.toInstant() );

【讨论】:

  • 如何将Sun Dec 06 11:15:00 IST 2015 日期格式转换为dd mm yyyy 我无法使用SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH) 与机器人Zz 一起尝试
  • @SagarHudge 使用 DateTimeFormatter 而不是 SimpleDateFormat。重读我的答案。
  • 针对4.4 eurekaAsus 5.1 的设备在将应用语言更改为非英语语言(如Marathi/Hindi)时出现解析问题,正常日期能够解析dd mm yyyy
  • @SagarHudge 在DateTimeFormatter 上指定Locale 以确定翻译中使用的人类语言和文化规范。
  • DateTimeFormatter 目标 264.4 anf 5.1 device 上有问题
【解决方案4】:

getSelectedDate 怎么样?无论如何,特别是在您的代码问题上,问题出在这一行:

new SimpleDateFormat("yyyy-MM-dd");

构造函数中的字符串必须与日期的格式相匹配。如何做到这一点的文档是here。看起来你需要接近“EEE MMM d HH:mm:ss zzz yyyy”的东西

【讨论】:

    【解决方案5】:

    回应: “How to convert Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México)) to dd-MM-yy in Java?”,它被标记为如何重复 p>

    试试这个: 使用java.util.Datejava.text.SimpleDateFormat,这是一个简单的解决方案。

    public static void main(String[] args) throws ParseException {
    
        String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))";
        Date f = new Date(fecha);
    
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setTimeZone(TimeZone.getTimeZone("-5GMT"));
        fecha = sdf.format(f);
        System.out.println(fecha);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2013-05-19
      • 2015-04-06
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多