【问题标题】:Java Date and Time FormattingJava 日期和时间格式
【发布时间】:2012-04-26 18:00:16
【问题描述】:

我正在尝试格式化时间,以便用户可以输入时间。

 b1.setStartTime(JOptionPane.showInputDialog("Enter Start time for Booking: "));

上面的代码有没有办法做到这一点?

我尝试将预订课程中的 startTime 更改为时间戳 并主要尝试使用此代码:

DateFormat timeFormatter =
    DateFormat.getTimeInstance(DateFormat.SHORT, b1.getStartTime());

但我很难把头绕过去。我想要做的就是允许用户输入时间作为简短版本,例如早上 7 点 20 分。然后我可以利用这段时间与 SQL 数据库进行比较。

对我来说 DateFormat.getTimeInstance() 似乎是要走的路。如果我要使用它,预订类中的 startTime 应该是 Date 类型吗?如何格式化用户输入?

【问题讨论】:

    标签: java date time date-format


    【解决方案1】:
    String datetime = [code to get time string];
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss a");
    Date date = (Date) sdf.parse(datetime);
    

    以后,您可以参考 SimpleDateFormat 的 java doc 来了解如何设置格式: http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

    【讨论】:

    • 我认为这仍然不对...您忘记了上午/下午的符号
    • @user1291492 哦,是的......现在添加它。
    • sdf.parse 返回一个日期,这里不需要投射任何东西。
    【解决方案2】:

    SimpleDateFormat 可能对您很方便:

     tf = new java.text.SimpleDateFormat ("h:mm a") 
    

    你可以用它来解析时间:

     Date d = tf.parse (textfield.getText ());
    

    反之,以这种格式输出日期/时间:

     System.out.println ("Time: " + tf.fomat (date)); 
    

    【讨论】:

    • 如果你这样做:Date d = tf.parse(textfield.getText()),你可能会得到 NullPointerException,IllegalArgumentException。你永远不应该这样做!输入必须经过清理,或者您必须用 try-catch 块包围您的代码以处理异常。
    • @Ozzy:是的,Ozzy,但我想这不是当前的主题。
    • 这是糟糕的代码......你不能教别人写那样的代码。
    • 这只是一个sn-p,它显示了它是如何工作的。当然,用户必须阅读文档以了解如何使用它的条件。我假设异常是已知的和编码风格指南等等。这不是针对初学者的教程,而是一个提示。但请随意投反对票。
    • 我认为 OP 是初学者,这就是为什么我要说的,用 try-catch 包围它或者先检查输入。
    【解决方案3】:

    首先,您应该始终检查 JOptionPane 的结果,以确保用户确实输入了某些内容并且没有单击取消。

    其次,如果你知道你希望你的用户如何输入时间,你需要(a)告诉他们如何输入它(b)使用 SimpleDateFormat 来解析它

    【讨论】:

      【解决方案4】:

      其他答案正确但已过时。

      java.time

      java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如java.util.Date.Calendarjava.text.SimpleDateFormatJoda-Time 团队还建议迁移到 java.time。

      要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。

      大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

      LocalTime

      LocalTime 类表示没有日期和时区的时间。

      定义格式模式。此处看到的模式适用于 12 小时制,预计小时值为 1-12。

      DateTimeFormatter f = DateTimeFormatter.ofPattern( "h:m a" );
      

      使用该格式化程序进行解析。

      String input = "7:20 AM";
      LocalTime localTime = LocalTime.parse( input , f );
      

      当然,您还应该清理您的数据输入并添加代码以捕获由于无效输入而引发的任何异常。为简洁起见,此处省略此类代码。

      数据库

      要查询数据库,如果您的 JDBC 驱动程序符合 JDBC 4.2 或更高版本,您可以直接通过 setObject/getObject 使用 LocalTime 对象。

      如果没有,请使用添加到旧类的新方法转换为旧 java.sql 类型。在这种情况下,java.sql.Time

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

      ……还有另一个方向……

      LocalTime localTime = t.toLocalTime();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多