Java日期错误

Java日期错误,java,date,Java,Date,我得到的日期格式如下,如java字符串: 美国东部时间2000年1月1日星期六00:00:00 我想把它转换成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){

我得到的日期格式如下,如java字符串:

美国东部时间2000年1月1日星期六00:00:00

我想把它转换成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());
}
但我有个例外: 不可解析日期:“2001年1月1日星期六00:00:00 CET”

请给我一些解决办法


谢谢

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

您正在尝试用格式“yyyy-MM-dd”解析日期

您需要构建一个与需要解析的格式相匹配的SimpleDataFormat,然后使用代码段中的一个来解析它

您需要的解析格式将类似于“EEE-MMM-dd-HH:mm:ss z-yyyy”。

您需要将现有字符串解析为,并使用另一种简单格式将解析后的日期对象格式化为相应的yyyy-mm-dd字符串

可以使用applyPattern更改SimpleDataFormat中的当前模式,这样就不必创建新对象


我将把模式留给学生作为练习。

您的模式需要与您正在解析的日期相匹配,如下所示: 查看文档以获取完整的说明

SimpleDateFormat sdf = new SimpleDateFormat ("EEE MMM dd hh:mm:ss zzz yyyy");

您使用的是什么
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的位置搞错了。没有遇到解析类型或其他类型的异常。

如果您的区域设置不是美国或其他英语语言区域设置,您将收到异常,因为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)));
注:2001年1月1日不是星期六:)

tl;博士 修复错误的输入文本后,可以使用现代java.time类解析该值

2001-01-01T00:00+01:00[欧洲/巴黎]

输入错误 您的示例输入字符串
“Sat Jan 01 00:00:00 CET 2001”
不正确。2001年1月1日是星期一,不是星期六。看

此外,在你的问题的早期,你使用2000年,而稍后你使用2001年

细节 正确,但使用了现在过时的类。您的格式模式与输入字符串不匹配是正确的

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f  );
首先,我们必须修复错误的输入字符串,将“Sat”更改为“Mon”

对于日期时间工作,只使用java.time类。这些将取代日期和日历等

定义与输入字符串匹配的格式模式。指定
区域设置
,以确定从输入字符串进行翻译时使用的人类语言和文化规范

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US );
ZonedDateTime zdt = ZonedDateTime.parse( input , f  );
生成一个标准格式的
字符串
,通过在方括号中添加时区名称进行扩展

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

提示
  • 您的输入字符串使用了糟糕的格式。始终使用标准格式将日期时间值交换为文本
  • 大陆/地区
    的格式指定,例如,或
    太平洋/奥克兰
    。切勿使用3-4个字母的缩写,如
    CET
    EST
    IST
    ,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*

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.
从哪里获得java.time类

  • 然后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类

    • 对于早期的Android(Hi,String temp=“Sat Jan 01 00:00:00 CET 2000”;SimpleDataFormat sdf=new SimpleDataFormat(“EEE MMM dd HH:mm:ss zzz yyyy”);SimpleDataFormat outputDate=new SimpleDataFormat(“yyyy mm dd”);解析日期=null;尝试{parsed=sdf.parse(temp);}捕获(异常e){System.out.println(“异常:+e.getMessage());}System.out.println(“日期:“+outputDate.format(已解析));我想我的编辑一定像《夜色中的飞船》一样传递了你的评论;)很抱歉使用了worng格式。我根据您的代码进行了更改,但仍然得到了异常Hi Lazarus,我也尝试了一个“z”,但仍然得到了异常除非最后一个System.out.println语句在try块中移动,否则无法编译,但我验证了它是否有效。如果您的区域设置不是我们,请参阅我的答案:)仅供参考,麻烦的旧日期时间类,例如,和
      java.text.simpleDataFormat
      现在被内置在Java8和更高版本中的类所取代。看见