如何parsingdate?

我想用SimpleDateFormatparsing这个date,它不工作:

 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"试这个代码,我有一个肯定的答案。 有什么问题? 我怎样才能parsing这种格式?

PS。 我从jDatePicker得到这个date,并没有指示如何修改用户selectdate时得到的date格式。

你不能期望用一个不同格式的SimpleDateFormatparsingdate。

为了parsing你的“Thu Jun 18 20:56:02 EDT 2009”datestring,你需要这样一个SimpleDateFormat(大致):

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

使用这个将stringparsing成Date,然后用另一个SimpleDateFormat将该Date转换为你想要的格式。

  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

问题是你有一个像这样格式化的date:

 Thu Jun 18 20:56:02 EDT 2009 

但是使用的SimpleDateFormat是:

 yyyy-MM-dd 

这两种格式不一致。 您需要构build一个SimpleDateFormat ,它与您试图parsing为Date的string布局相匹配。 为了使事情变得容易,你需要一个SimpleDateFormat像这样:

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

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

我们现在有一个更现代的方式来做这个工作。

java.time

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

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

顺便提一下,请注意,默认情况下,java.time是如何使用ISO 8601格式生成string的,但通过在括号中附加时区名称进行扩展。

 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 [America / New_York]

调整时区

为了好玩,让我们调整到印度时区。

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

zdtKolkata:2009-06-19T06:26:02 + 05:30 [Asia / Kolkata]

转换为juDate

如果你真的需要一个java.util.Date对象来使用尚未更新到java.timetypes的类,请转换。 请注意,您正在丢失指定的时区,但自动调整为UTC 。

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

如何getSelectedDate ? 无论如何,特别是在你的代码问题上,问题是这一行:

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

构造函数中的string必须与date的格式相匹配。 如何做到这一点的文件在这里 。 看起来你需要接近“EEE MMM d HH:mm:ss zzz yyyy”

回复:“ 如何将2016年9月13日星期二00:00:00 GMT-0500(Hora de verano central(México))转换为Java中的dd-MM-yy? ”,它被标记为重复

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

 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); }