【问题标题】:[Java Dates]Using an particular format to add days[Java Dates]使用特定格式添加日期
【发布时间】:2017-03-20 07:27:58
【问题描述】:

今天我想请教一种比较有效的方法来转换custom formatted selectors to seconds

如果我输入 '5d, 6h' 它应该输出 => [x 秒数] 其中选择器可以是任意数字> 999,并且支持minutes,seconds, hours, days, and years, where the preceding character is the selector, y for years, h for hours, and etc.。另一个例子是9d 4s,它仍然输出[x number of seconds]。两个“选择器”字符串存储在一个数组中。非常感谢!

【问题讨论】:

  • 不客气 - 有什么代码可以分享吗?
  • @ScaryWombat 我没有,因为我正在询问解决它的好方法。我可以自己写,只是想弄清楚该怎么做。
  • 所以如果输入包含h 使用选择器1,否则使用选择器2?
  • 不,两者都用。我会通过将它们加在一起来计算两者。例如,输入 1 => 5h 输入 2 => 2m 输出 => 18120 @ScaryWombat
  • YOU 如何手动操作?以与您相同的方式编写代码。

标签: java string date


【解决方案1】:

虽然您的问题令人困惑,但有几个类和标准字符串格式可能与您想要的很接近

Java 提供了两个类来表示与时间轴无关的时间跨度。

  • Duration(天-时-分-秒)
  • Period(年-月-日)

这两个类都可以解析和生成标准ISO 8601 格式的字符串 P[n]Y[n]M[n]DT[n]H[n]M[n]S。 P 标志着开始,T 将 y-m-d 与 h-m-s 部分分开。所以五天六小时是P5DT6H

Duration d = Duration.parse( "P5DT6H" );  

往另一个方向发展。

String output = d.toString();

P5DT6H

您可以通过调用各种方法来查询值,Java 9 中添加了更多方法。

如果您想要整个持续时间的总秒数:

long totalSeconds = d.getSeconds() ;

已经在 Stack Overflow 上多次介绍过,因此请搜索更多讨论和示例。请在发帖前更彻底地搜索 Stack Overflow。

【讨论】:

    【解决方案2】:

    我在 java 中编写了一个开源库 MgntUtils,它部分地满足了这一要求。它包含一个静态方法parsingStringToTimeInterval(String value) 这个方法解析一个字符串,该字符串预计会保存一些时间间隔值——一个带有可选时间单位后缀的数值。例如,字符串“38s”将被解析为 38 秒,“24m” - 24 分钟 “4h” - 4 小时,“3d” - 3 天,“45” 被解析为 45 毫秒。支持的后缀是“s”代表秒,“m”代表分钟,“h”代表小时,“d”代表天。没有后缀的字符串被认为以毫秒为单位保存一个值。后缀不区分大小写。如果提供的 String 包含不受支持的后缀或持有负数值或零或持有非数值 - 则抛出 IllegalArgumentException。此方法返回 TimeInterval 类 - 该类也在此库中定义。从本质上讲,它拥有两个具有相关 getter 和 setter 的属性:long "value" 和 java.util.concurrent.TimeUnit。但是除了 getter 和 setter 之外,这个类还有方法 toMillis()、toSeconds()、toMinutes()、toHours() toDays()。这些方法在指定的时间范围内返回 long vlaue(与类 java.util.concurrent.TimeUnit 中的相应方法相同)

    此方法对于从配置文件解析时间间隔属性(例如超时或等待时间)可能非常有用。它消除了从不同时间尺度到毫秒来回的不必要计算。假设您有一个 methodInvokingInterval 属性需要设置 5 天。因此,为了设置毫秒值,您需要计算 5 天是 432000000 毫秒(显然不是不可能完成的任务,但很烦人且容易出错),然后任何其他看到值 432000000 的人都必须将其计算回 5 天,这令人沮丧。但是使用这种方法,您将属性值设置为“5d”并调用代码

    long seconds = TextUtils.parsingStringToTimeInterval("5d").toSeconds();
    

    将解决您的转换问题。显然,这不是过于复杂的功能,但它可以在您的配置文件中增加简单性和清晰度,并将一些挫败感和“愚蠢”的错误计算减少到毫秒级的错误中。以下是描述 MgntUtils 库以及获取它的文章的链接:MgntUtils

    【讨论】:

      猜你喜欢
      • 2016-03-02
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多