题
这个问题在这里已经有答案了:
- Java 字符串到日期的转换 13 个答案
我正在尝试解析这个日期 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"
, ,我有一个肯定的答案。有什么问题?我该如何解析这种格式?
附言。我从一个人那里得到了这个日期 jDatePicker
并且没有关于如何修改用户选择日期时得到的日期格式的说明。
解决方案
您不能期望使用使用不同格式设置的 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);
...
Java文档: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
其他提示
问题是您的日期格式如下:
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 页面并了解如何使用这些字符。
我们现在有一种更现代的方法来完成这项工作。
java.time
这 java.time 框架与 Java 8 及更高版本捆绑在一起。看 教程. 。这些新课程的灵感来自 乔达时间, , 被定义为 JSR 310, ,并扩展为 三十额外 项目。它们比麻烦的旧类 java.util.Date/.Calendar 等有了巨大的改进。
请注意,3-4 个字母的代码如 EDT
既不标准化也不独特。尽可能避免它们。学会使用 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 );
运行时。
兹德特: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. 日期
如果您确实需要 java.util.Date 对象与尚未更新为 java.time 类型的类一起使用,请进行转换。请注意,您将失去指定的时区,但同一时刻会自动调整为 世界标准时间.
java.util.Date date = java.util.Date.from( zdt.toInstant() );
回应:”如何在 Java 中将 Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de veranocentral (México)) 转换为 dd-MM-yy?“,它被标记了如何重复
尝试这个:和 java.util.Date
, java.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);
}