Java 自定义日期参数输入

标签 java date date-formatting

我目前正在编写一个Spigot/Craftbukkit 插件来管理禁令。在一种方法中,我有 TempBan 命令执行器。我的目标是让用户使用自定义“速记”格式指定禁令持续时间。 例如:/tempban MyUser 5d2w 我的原因"

我希望在毫秒内解析并返回字符串5d2w。我尝试过自己制作,但它不可靠,并且只支持一种时间格式。所以你不能进行组合。有没有一种有效的方法来使用JodaTimeJava的默认日期格式类来完成此任务?谢谢!

最佳答案

tl;博士

Duration.parse( "PT1H30M" ).toMillis()

ISO 8601

无需发明自己的自定义速记格式。 ISO 8601标准已经定义了类似的format for durations

模式PnYnMnDTnHnMnS使用P来标记开始,使用T来分隔任何年-月-日部分和任何小时-分钟-秒部分。

示例:

  • 一个半小时是 PT1H30M
  • P3Y6M4D 代表“三年六个月零四天”。

java.time

java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。这包括 PeriodDuration用于表示未附加到时间线的时间跨度的类。

持续时间

Duration d = Duration.ofHours( 1 ).plusMinutes( 30 );
String output = d.toString();

PT1H30M

并解析。

Duration d2 = Duration.parse( "PT1H30M" );

您可以询问持续时间的总毫秒数。

long millis = d2.toMillis();

5400000

参见live code in IdeOne.com .

但请记住,java.time 类具有更精细的分辨率(纳秒)。因此,当您请求毫秒时,您可能会丢失数据。

此外,我强烈建议您坚持使用 java.time 对象和 ISO 8601 字符串,并避免将日期时间值表示为毫秒数等。

句号

对于年-月-日,请使用 Period 类。

Period p = Period.parse( "P3Y6M4D" );

…还有…

String output = p.toString();

P3Y6M4D

注意 normalized这个类的方法。例如,“1 年零 15 个月”的期间将标准化为“2 年零 3 个月”。

另请注意,Period 是基于 LocalDate 信息构建的。因此,它没有时区的概念,也不了解夏令时 (DST) 等异常情况。

这门课需要一整天的时间。因此该类没有提供明确的方法来计算毫秒。

<小时/>

关于java.time

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 java.time future 可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter ,和more .

关于Java 自定义日期参数输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388963/

相关文章:

Java 泛型 - 在我调用 instanceof 之后,有什么方法可以避免强制转换(和未经检查的警告)?

java - 插入字符串的某些部分

java - 结合 jsonpath 表达式读取 JSON 字符串中的 2 个嵌套属性

sql - 创建一个字段来计算日期范围内一个月内的天数?

python - 值错误 : time data does not match format when parsing a date

javascript - 按日期对对象数组进行排序,其中日期是键

javascript - Google 脚本中的序数日期格式(th、rd、st、nd)

php - 如何从给定的字符串获取php日期格式

java - 如何移动字符串中的字符位置以实现日期格式?

java - 使用未捕获的异常处理程序在异常上启动新线程