java.text.ParseException:无法解析的日期:“8:30 AM”

时间:2015-11-18 09:00:05

标签: java date simpledateformat

我正在尝试解析“上午8:30”,但我得到了无法解析的日期例外。

从我的UI方面,我得到“上午8:30”和“下午6:30”类型的值,但我必须将该字符串转换为日期格式并将该日期保存在我的数据库中。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class Test {

    public static void main(String[] args) {

        SimpleDateFormat timingFormat = new SimpleDateFormat("h a",
            Locale.US);
        String dateInString = "8:30 AM";

        try {
            // This line throws Unparseable exception
            Date date = timingFormat.parse(dateInString);
            System.out.println(date);

        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

}

3 个答案:

答案 0 :(得分:1)

来自Documentation

  

解析日期的年份值是1970年,如果没有,则使用GregorianCalendar   年份值来自解析操作。 TimeZone值可以   被覆盖,取决于给定的模式和时区值   在文中。

试试这个

         SimpleDateFormat timingFormat = new SimpleDateFormat("h a", Locale.US);
         Date date = timingFormat.parse("8 AM");
         System.out.println(date.toString());

输出

Thu Jan 01 08:00:00 IST 1970

<强>更新

要获得今天的日期,您可以在解析后尝试这样的事情

     int hours = date.getHours();
     Date today = new Date();
     today.setHours(hours);
     System.out.println(today);

注意 getHours()setHours是不推荐使用的方法。建议您使用Calendar。您必须明确设置小时,分钟。

<强>更新

如果输入是8:30左右,那么你必须像这样解析它

         SimpleDateFormat timingFormat = new SimpleDateFormat("h:mm a", Locale.US);
         Date date = timingFormat.parse("8:30 AM");
         System.out.println(date.toString());

输出

Thu Jan 01 08:30:00 IST 1970

根据输入的不同,您需要选择您感兴趣的format哪种类型。您可以检查字符串是否包含:,具体取决于您可以使用SimpleDateFormat

答案 1 :(得分:0)

只需要解析上午8:30,只需用

更改上面的格式化程序即可

SimpleDateFormat timingFormat = new SimpleDateFormat(&#34; h:mm a&#34;);

此致

答案 2 :(得分:0)

接受的答案是正确的,但过时了。

如上所述,问题有一个输入字符串,这意味着只有一个时间,而java.util.Date类表示日期加上一个时间。

您需要的是一个只代表一天中某个时间的课程。在Java 8之前的旧版Java中没有这样的类。

java.time

Java 8及更高版本中内置的java.time框架取代了棘手的旧java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial

LocalTime

java.time类包括LocalTime类。此类表示没有任何日期和时区的时间。

请注意,formatter我们specified Locale使用英语正确识别可能因人类语言而异的字符串AMPM

String input = "8:30 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "h:m a" , Locale.ENGLISH );
LocalTime localTime = LocalTime.parse ( input , formatter );

转储到控制台。

System.out.println ( "localTime: " + localTime );
  

localTime:08:30

数据库

接下来,数据库。最终我们应该看到更新JDBC drivers以直接处理java.time类型。在那之前,我们必须从java.time类型转换为旧的java.sql types

java.time转换为java.sql

对于这个问题,这意味着java.sql.Time类。旧java.sql.Time课程有一种便于转换的新方法,valueOf

java.sql.Time sqlTime = java.sql.Time.valueOf ( localTime );

从那里,JDBC驱动程序将从java.sql时间转换为数据库类型。对于这个问题,这可能意味着标准TIME SQL type

通过JDBC驱动程序将java.sql。*对象传递给数据库

通过传递上面显示的sqlTime变量,使用PreparedStatement插入或更新您的数据。在StackOverflow.com中搜索SQL中此类插入/更新工作的无数示例。