java—如何动态更改日期格式

2wnc66cl  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(362)

我的时间格式有问题。有时我的值是hh:mm:ss,有时是mm:ss格式。
我的代码看起来像:

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
String time = "01:48:00"
Date remainedTimeDate = sdf.parse(time);

它工作,当我得到格式hh:mm:ss,但当我有时间在格式mm:ss我得到一个错误,如,值不能被解析。是否可以动态更改日期格式?

s4n0splo

s4n0splo1#

是的,你能做到。基于if条件,例如,如果hour和min的大小写都比较小,则可以更改构造函数。但是请注意,简单的日期格式不是线程安全的。使方法同步或锁定简单日期格式对象。

0yycz8jy

0yycz8jy2#

java.time.duration文件

假设您的字符串表示一个时间量(例如,一个持续时间),那么在java中使用它的正确类是 Duration 来自java.time,现代java日期和时间api。不幸的是 Duration 无法从框中分析字符串。它有一个 parse 只接受iso 8601格式的方法。iso 8601格式的持续时间如下所示 PT1H48M30S . 它一开始看起来很不寻常,但当你知道怎么读的时候就很简单了。阅读刚刚给出的示例,时间为1小时48分30秒。因此,要解析hh:mm:ss和mm:ss格式的字符串,我首先使用几个正则表达式将它们转换为iso8601。

// Strings can be hh:mm:ss or just mm:ss
    String[] examples = { "01:48:30", "26:57" };
    for (String example : examples) {
        // First try to replace form with two colons, then form with one colon.
        // Exactly one of them should succeed.
        String isoString = example.replaceFirst("^(\\d+):(\\d+):(\\d+)$", "PT$1H$2M$3S")
                .replaceFirst("^(\\d+):(\\d+)$", "PT$1M$2S");
        Duration dur = Duration.parse(isoString);
        System.out.format("%8s -> %-10s -> %7d milliseconds%n", example, dur, dur.toMillis());
    }

此外,我的代码还演示了如何将每个持续时间转换为毫秒。输出为:

01:48:30 -> PT1H48M30S -> 6510000 milliseconds
   26:57 -> PT26M57S   -> 1617000 milliseconds

链接

oracle教程:date time解释如何使用java.time。
维基百科文章:iso 8601

chy5wohz

chy5wohz3#

日期时间api中没有内置的功能来执行此操作。此外,遗留的日期时间api( java.util 日期时间类型及其格式api, SimpleDateFormat )过时且容易出错。建议完全停止使用并切换到 java.time ,现代日期时间api*。
你可以用正则表达式模式匹配字符串, \d{1,2}:\d{1,2} 意思是用冒号分隔的一个或两个数字。如果比赛成功,请预赛 00: 将其转换为 HH:mm:ss 格式。
演示:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Optional;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] arg) {
        // Test
        Stream.of(
                    "01:48:00", 
                    "48:00"
        ).forEach(s -> parseToTime(s).ifPresent(System.out::println));
    }

    static Optional<LocalTime> parseToTime(String s) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:m:s");
        if (s.matches("\\d{1,2}:\\d{1,2}")) {
            s = "00:" + s;
        }
        LocalTime time = null;
        try {
            time = LocalTime.parse(s, dtf);
        } catch (DateTimeParseException e) {
            System.out.println(s + " could not be parsed into time.");
        }
        return Optional.ofNullable(time);
    }
}

输出:

01:48
00:48

从trail:date-time了解有关现代日期时间api的更多信息。

  • 出于任何原因,如果您必须坚持使用Java6或Java7,您可以使用threeten backport,它将大部分java.time功能向后移植到Java6和Java7。如果您正在为一个android项目工作,并且您的android api级别仍然不符合java-8,请检查通过desugaring提供的java8+api以及如何在android项目中使用threetenabp。

相关问题