我按照以下格式获取日期,如java string:
Sat Jan 01 00:00:00 CET 2000
我想将它转换为yyyy-MM-dd fromat。为此我正在做:
String strDate = "Sat Jan 01 00:00:00 CET 2001";
SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd");
try{
Date parsed = sdf.parse(strDate);
}catch(Exception e){
System.out.println("Exception: " + e.getMessage());
}
但我得到例外: 无法解释的日期:“Sat Jan 01 00:00:00 CET 2001”
请给我一些解决方案。
谢谢
答案 0 :(得分:8)
SimpleDateFormat需要是输入日期格式,然后您可以使用另一个SimpleDateFormat来获取相应的输出格式,即:
String strDate = "Sat Jan 01 00:00:00 CET 2001";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
SimpleDateFormat outputDate = new SimpleDateFormat("yyyy-MM-dd");
try{
Date parsed = sdf.parse(strDate);
}
catch(Exception e){
System.out.println("Exception: " + e.getMessage());
}
System.out.println("Date: " + outputDate.format(parsed));
答案 1 :(得分:4)
您正尝试使用“yyyy-MM-dd”格式解析日期。
您需要构建一个与您需要解析的格式匹配的SimpleDateFormat,然后使用代码段中的格式来format。
你需要的解析格式将是“EEE MMM dd HH:mm:ss z yyyy”。
答案 2 :(得分:4)
您需要SimpleDateFormat 解析现有字符串,将另一个SimpleDateFormat 格式解析后的Date对象转换为相应的yyyy-MM-dd字符串。< / p>
您可以使用 applyPattern 更改SimpleDateFormat中的当前模式,这样您就不必创建新对象。
我会把这些模式留给学生练习。
答案 3 :(得分:1)
您的模式需要与您要解析的日期相匹配,如下所示: 请查看SimpleDateFormat文档以获取完整说明。
SimpleDateFormat sdf = new SimpleDateFormat ("EEE MMM dd hh:mm:ss zzz yyyy");
答案 4 :(得分:1)
如果您的语言环境不是美国或其他英语语言环境,您将收到异常,因为Sat未知,因此您应该以输入格式指定语言环境。
试试这个:
String dateAsString = "Sat Jan 01 00:00:00 CET 2001";
SimpleDateFormat inputFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.US);
SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("Date: " + outputFormat.format(inputFormat.parse(dateAsString)));
ps:2001年1月1日不是星期六:)
答案 5 :(得分:1)
修复错误的输入文本后,可以使用现代 java.time 类解析此值。
ZonedDateTime.parse(
"Mon Jan 01 00:00:00 CET 2001" // Changed incorrect "Sat" to correct "Mon".
,
DateTimeFormatter.ofPattern(
"EEE MMM dd HH:mm:ss z uuuu"
,
Locale.US // Specify a `Locale` to determine human language and cultural norms used in translation.
) // Returns a `DateTimeFormatter` object to be passed as second argument to `parse` method.
) // Returns a `ZonedDateTime` object.
.toString() // Generates a `String` using standard ISO 8601 format extended by appending zone name in square brackets.
2001-01-01T00:00 + 01:00 [欧洲/巴黎]
您的示例输入字符串"Sat Jan 01 00:00:00 CET 2001"
不正确。 2001年1月1日是星期一,而不是星期六。见calendar display。
此外,在您的问题的早期,您使用2000年,而稍后您使用2001年。
Answer by Lazarus是正确的,但使用现在已经过时的类。这是正确的,因为您的格式化模式无法匹配输入字符串。
首先我们必须修复你错误的输入字符串,将“Sat”改为“Mon”。
String input = "Mon Jan 01 00:00:00 CET 2001"; // After altering the original input string, fixing "Sat" to be "Mon".
仅使用 java.time 类进行日期工作。这些取代Date
&amp; Calendar
等。
定义格式模式以匹配输入字符串。指定Locale
以确定从输入字符串进行翻译时使用的人类语言和文化规范。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );
通过在方括号中附加时区名称,生成标准ISO 8601格式的String
。
String output = zdt.toString() ;
System.out.println(output);
2001-01-01T00:00 + 01:00 [欧洲/巴黎]
要查看UTC中的相同时刻,请提取Instant
。
Instant instant = zdt.toInstant() ;
instant.toString():2000-12-31T23:00:00Z
continent/region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用诸如CET
,EST
或IST
之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。 java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 6 :(得分:0)
您使用的是哪个Date
课程?如果您使用的是IDE,则很容易意外地使用java.sql.Date
而不是java.util.Date
。这是我的完整示例程序及其输出:
package pkg;
import java.lang.String;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Foo
{
public static void main(String[] args) throws Exception
{
Date parsed = null;
String strDate = "Sat Jan 01 00:00:00 CET 2001";
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
SimpleDateFormat outputDate = new SimpleDateFormat("yyyy-MM-dd");
try{
parsed = sdf.parse(strDate);
}
catch(Exception e){
System.out.println("Exception: " + e.getMessage());
}
System.out.println("Date: " + outputDate.format(parsed));
}
}
产生
日期:2000-12-31
这是正确的,因为我在EST,除非我错误地认为CET在哪里。没有遇到异常,解析类型或其他。