【问题标题】:how to change the current date如何更改当前日期
【发布时间】:2021-02-11 04:25:19
【问题描述】:

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

示例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) 方法 但是不明白怎么用。

【问题讨论】:

  • 小时数可能超过 24 小时,没关系。毫秒可以大于 999 吗?

标签: java date


【解决方案1】:

一个宽大的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

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

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

链接: ISO 8601

【讨论】:

    【解决方案2】:

    试试这个:

    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));
    }
    

    【讨论】:

    • 对于添加毫秒,我会发现以下方法更好:.plus(Integer.parseInt(arr[3]) , ChronoUnit.MILLIS)
    【解决方案3】:

    【讨论】:

      【解决方案4】:

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

        public void addDateTime(int hours, int minuts, int seconds, int nanos) {
              LocalDateTime adt = LocalDateTime.now();
              System.out.println(adt);
              adt = adt.plusHours(hours);
              adt = adt.plusMinutes(minuts);
              adt = adt.plusSeconds(seconds);
              adt = adt.plusNanos(nanos);
              System.out.println(adt);
              
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        • 1970-01-01
        • 2017-04-28
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多