微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何动态更改日期格式

如何解决如何动态更改日期格式

我的时间格式有问题。有时我有 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 时,我得到一个错误,例如无法解析值。是否可以动态更改日期格式?

解决方法

日期时间 API 中没有内置功能来执行此操作。此外,旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已经过时且容易出错。建议完全停止使用它们并切换到 java.timemodern date-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 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

,

java.time.Duration

假设您的字符串表示时间量(例如,持续时间),那么在 Java 中用于它的正确类是来自 java.time(现代 Java 日期和时间 API)的 Duration。不幸的是,Duration 无法立即解析您的字符串。它有一个 parse 方法,只接受 ISO 8601 格式。持续时间的 ISO 8601 格式类似于 PT1H48M30S。起初看起来很不寻常,但当您知道如何阅读时,它很容易阅读。以 1 小时 48 分 30 秒的时间段阅读刚刚给出的示例。因此,要解析 hh:mm:ss 和 mm:ss 格式的字符串,我首先使用几个正则表达式将它们转换为 ISO 8601。

    // 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

链接

,

是的,你可以这样做。基于类似 Say 的 If 条件,如果 Hour 和 Min 是小写,您可以更改构造函数。但是请知道简单的日期格式不是线程安全的。要么使方法同步,要么锁定简单日期格式对象。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。