如何更改当前日期

时间:2021-02-10 10:13:02

标签: java date

我的方法接受 - 以符号 / 分隔的小时、分钟、秒和毫秒作为字符串参数 如何将方法中的参数添加到当前日期。

示例1:今天,02/10/2021,该方法接收到metnode数据(10/10/10/10)-输出-02/10/2021 10:10:10

示例2:今天,02/10/2021,该方法接收到metnode数据(55/10/10/10)-输出-02/12/2021 07:10:10 也就是说,您需要在当前日期上加上 55 小时 10 秒 10 秒和 10 毫秒。

您不能使用 Calendar 和 StringTokenizer 类。

public void method(String s) {

        s = s.replaceAll("/", "-");

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");

        final LocalDateTime now = LocalDateTime.parse(s, formatter.withResolverStyle(ResolverStyle.LENIENT));

        System.out.println(now);
    }

我找到了 withResolverStyle (ResolverStyle.LENIENT) 方法 但是不明白怎么用。

4 个答案:

答案 0 :(得分:2)

一个宽容的DateTimeFormatter就够了

我不知道这是否是最好的解决方案。这可能取决于口味。它确实使用了您提到的 ResolverStyle.LENIENT,并且通常按照您问题中的代码行工作,只是经过修复和稍微简化。

我的格式化程序包括日期和时间。这对于将剩余小时数转换为天数是必要的。

private static final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
        .appendPattern("uuuu-MM-dd H/m/s/")
        .appendValue(ChronoField.MILLI_OF_SECOND)
        .toFormatter()
        .withResolverStyle(ResolverStyle.LENIENT);

接下来我们需要一个与格式化程序匹配的字符串。因此,让我们将日期添加到我们已经获得的时间字符串中:

    String timeString = "55/10/10/10";
    
    LocalDate today = LocalDate.now(ZoneId.of("America/Regina"));
    String dateTimeString = "" + today + ' ' + timeString;
    LocalDateTime dateTime = LocalDateTime.parse(dateTimeString, formatter);

    System.out.println(dateTime);

我今天(2 月 10 日)运行代码时的输出是:

<块引用>

2021-02-12T07:10:10.010

一个不同的想法:使用Duration

编辑:另一种方法是使用 Duration 类。这样做的一个原因是,您似乎确实在添加持续时间而不是设置一天中的时间。一个缺点是将您的字符串解析为 Duration 有点棘手。我们要使用的 Duration.parse 方法仅接受 ISO 8601 格式。它像 PT55H10M10.010S 一样持续 55 小时 10 分 10.010 秒。是的,毫秒需要作为秒的一小部分给出。

    String isoTimeString = timeString.replaceFirst("(/)(\\d+)$", "$100$2")
            .replaceFirst("(\\d+)/(\\d+)/(\\d+)/0*(\\d{3})", "PT$1H$2M$3.$4S");
    Duration dur = Duration.parse(isoTimeString);
    LocalDateTime dateTime = LocalDate.now(ZoneId.of("Asia/Kathmandu"))
            .atStartOfDay()
            .plus(dur);

当我刚刚运行它时——已经是 2 月 11 日在尼泊尔加德满都——输出是:

<块引用>

2021-02-13T07:10:10.010

我使用了两次对 replaceFirst() 的调用,每次都使用一个正则表达式。第一次调用只是在毫秒中添加一些前导零。替换字符串中的 $1$2 给出了正则表达式中用圆括号表示的第一个和第二个匹配的内容。

第二个 replaceFirst() 调用建立了 ISO 8601 格式,其中包括确保毫秒恰好是三位数字,以便它们作为秒的小数部分工作。

链接: ISO 8601

答案 1 :(得分:1)

查看 LocalDateTime documentation。它提供了多种组合日期的方法。如:

答案 2 :(得分:1)

为了简单起见,您可以使用 LocalDateTime 类。这很容易理解。请参考以下代码用于将小时、分钟、秒和纳秒添加到当前日期时间。 然后可以根据需要使用任何格式模式轻松格式化此日期时间。

class MainViewModel : ViewModel() {

  private val _shouldCloseLiveData = MutableLiveData<Event<Boolean>>()
  val shouldCloseLiveData: LiveData<Event<Boolean>> = _shouldCloseLiveData
  
  fun someAction(){
      _shouldCloseLiveData.postValue(Event(true))
  }

}

答案 3 :(得分:1)

试试这个:

public void method(String s) {
    String[] arr = s.split("/");
    LocalDateTime now = LocalDateTime.of(
        LocalDate.now(), LocalTime.of(0, 0))
        .plusHours(Integer.parseInt(arr[0]))
        .plusMinutes(Integer.parseInt(arr[1]))
        .plusSeconds(Integer.parseInt(arr[2]))
        .plusNanos(Integer.parseInt(arr[3]) * 1_000_000L);
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/yyyy HH:mm:ss");
    System.out.println(now.format(formatter));
}