【问题标题】:How to format a LocalTime variable如何格式化 LocalTime 变量
【发布时间】:2019-01-20 08:24:12
【问题描述】:

我对 Java windowbuilder 还是很陌生,这是我第一个项目的一部分。

String starttime = JOptionPane.showInputDialog(null, "What time would you like to start your revision ? (ie:12:24) ");

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm");
LocalTime start = LocalTime.parse(starttime,dtf);

我想将 start 的格式从 ("HH:mm:ss..etc") 转换为 ("HH:mm"),但由于某种原因,LocalTime.parse 出现错误。任何建议我应该做什么。

我正在使用 Joda Time

【问题讨论】:

  • 失败时的输入是什么?错误是什么?
  • 请分享那个错误
  • 它不是输入。它说: LocalTime 类型中的方法 parse(java.lang.String, org.joda.time.format DateTimeFormatter ) 不适用于争论 (java.lang.String,, java.time.format.DateTimeFormatter);

标签: java swing date nsdateformatter jodatime


【解决方案1】:

您在java.time 中错误地引用了ofPattern。使用 JodaTime 的forPattern

DateTimeFormatter dtf = DateTimeFormat.forPattern("HH:mm");
LocalTime start = LocalTime.parse(starttime, dtf);
System.out.println(dtf.print(start));

或者干脆

System.out.println(LocalTime.parse(startTime).toString("HH:mm"));

【讨论】:

  • 错误不再出现,但start的值仍然显示秒和毫秒(我不想要)。你有什么建议可以让我只用几小时和几分钟?
  • 在更新答案中显示时间时使用您在此问题中创建的DateTimeFormatter
【解决方案2】:

tl;博士

使用 Java 内置的 java.time 类,而不是 Joda-Time

LocalTime.parse( "23:45:12.123456789" )       // Represent a time-of-day without date and without time zone. Parsing standard ISO 8601 format HH:MM:SS.SSSSSSSSS in 24-hour clock. Returns a `LocalTime` object.
         .truncatedTo( ChronoUnit.MINUTES )   // Produce a new value, based on original, but lopping off any seconds or fractional-second. Returns another `LocalTime` object.
         .toString()                          // Generate a `String` with text representing the value of this date-time value, using standard ISO 8601 format. Returns a `String` object.

23:45

但我收到 LocalTime.parse 的错误

您指定的格式模式必须与输入字符串匹配——您的格式不匹配。

如上面的代码所示,如​​果输入标准 ISO 8601 格式,内置的 LocalTime.parse 功能会处理变化。所以根本不需要费心指定格式模式。

详情

Answer by Reimeus 是正确的,但使用了过时的 Joda-Time 类。虽然是一个优秀的库,但它的创建者(主要是 Stephen Colebourne)继续创建 Java 8 及更高版本中内置的 java.time 类。 Joda-Time 项目现在处于维护模式,并建议迁移到 java.time

java.time

如果您的用户输入采用标准ISO 8601 格式,则无需指定格式模式来解析字符串输入。这意味着使用 1-23 小时的 24 小时制时钟,以及 1-9 小时的前导填充零:01-09。 java.time 类在解析/生成字符串时默认使用标准 ISO 8601 格式。

String input1 = "23:45";
String input2 = "23:45:12";
String input3 = "23:45:12.123456789";

LocalTime lt1 = LocalTime.parse( input1 );
LocalTime lt2 = LocalTime.parse( input2 );
LocalTime lt3 = LocalTime.parse( input3 );

System.out.println( lt1 );
System.out.println( lt2 );
System.out.println( lt3 );

23:45

23:45:12

23:45:12.123456789

抑制显示

如果您想禁止显示任何秒或小数秒,请使用DateTimeFormatter 类。该课程有很好的文档记录,并且已经在 Stack Overflow 上多次介绍过,因此请搜索更多讨论和示例。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "HH:mm" , Locale.US ) ;
String output = myLocalTime.format( f ) ;  

23:45

截断

如果您想从日期时间值中删除任何秒或小数秒,请截断。

LocalTime.parse( "23:45:12" )
         .truncatedTo( ChronoUnit.MINUTES ) 
         .toString()

23:45

……或者……

LocalTime.parse( "23:45:12.123456789" )
         .truncatedTo( ChronoUnit.MINUTES ) 
         .toString()

23:45


关于java.time

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

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2020-11-11
    • 2014-08-06
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多