Java日期错误

时间:2010-10-06 11:24:59

标签: java date

我按照以下格式获取日期,如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”

请给我一些解决方案。

谢谢

7 个答案:

答案 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)

TL;博士

修复错误的输入文本后,可以使用现代 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

提示

  • 您的输入字符串使用了糟糕的格式。始终使用标准ISO 8601格式将日期时间值作为文本进行交换。
  • continent/region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用诸如CETESTIST之类的3-4字母缩写,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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在哪里。没有遇到异常,解析类型或其他。