java - 如何动态更改日期格式
问题描述
我的时间格式有问题。有时我有 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.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 工作level 仍然不符合 Java-8,请检查Java 8+ APIs available through desugaring和How to use ThreeTenABP in Android Project。
推荐阅读
- php - 值未正确插入数组
- mongodb - Mongodb graphLookup cond 进入 connectToField
- firebase - 无需用户身份验证的云 Firestore (firebase) 的安全安全规则
- laravel - Laravel 中酒店订房问题查询
- elasticsearch - Elasticsearch 中累积基数聚合的替代解决方案
- reactjs - Contentful SSR React App 补水后出错
- sql - 将多列值合并到一行中的一列Oracle SQL,而不会丢失颜色格式
- react-native - 无法将 react-native-linear-gradient 别名为 react-native-web-linear-gradient 以响应本机 Web 应用程序
- javascript - JQGrid - 事件网格仅“第一次”完成/应用默认过滤器首次加载
- python - 在python中将图像拆分为不同的子图像