以 HH:MM:SS.ssssss 格式向时间戳字符串添加尾随零
Adding trailing zeros to Timestamp string in HH:MM:SS.ssssss format
将字符串表示时间戳视为 "2017-06-05T19:27:10.917360"
。但
如果在时间戳上方有连续的尾随零,上游系统会在上面的示例中截断秒和毫秒的零
喜欢 "2017-06 05T19:27:00.000000"
java 中是否有可用的格式化程序以特定格式添加尾随零,包括分隔符如 :
在小时、分钟和秒之间。
例如:"2017-06-05"
应转换为 "2017-06-05T00:00:00.000000"
编辑:- 可以从 HH、MM、SS 的任何字段中截断零。如果时间戳的尾部有一系列零,它将被截断
DateTimeFormatter desiredFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
String truncatedDateTimeString = "2017-06-05T19:27";
LocalDateTime dateTime = LocalDateTime.parse(truncatedDateTimeString);
String fixedDateTimeString = dateTime.format(desiredFormatter);
System.out.println(fixedDateTimeString);
这会打印
2017-06-05T19:27:00.000000
如果分钟和小时也丢失了,那么我们需要更多技巧。查看 DateTimeFormatterBuilder
及其 parseDefaulting
方法。在格式模式字符串中使用方括号 []
将可能缺失的部分括起来。如果时间被截断,我不确定你的字符串会是什么样子——T
也会丢失吗?
另一方面,如果字符串是 2017-06-05T19:27:10.917360
,上面的方法也有效,在这种情况下,只打印相同的字符串。
另外我不确定你真正想解决的是哪个问题。尾随零是多余的,那么它们被截断的问题是什么?
编辑: 下面的方法充实了我所说的 DateTimeFormatterBuilder
,它的 parseDefaulting
方法和格式模式字符串中的方括号:
public static String addTrailingZerosToTimestamp(String timeStamp) {
DateTimeFormatter truncatedFormatter = new DateTimeFormatterBuilder()
.appendPattern("uuuu-MM-dd['T'HH[:mm[:ss[.SSSSSS]]]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
.toFormatter();
DateTimeFormatter desiredFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
LocalDateTime dateTime = LocalDateTime.parse(timeStamp, truncatedFormatter);
return dateTime.format(desiredFormatter);
}
它适用于 2017-06-05
、2017-06-05T19
、2017-06-05T19:27
、2017-06-05T19:27:10
和 2017-06-05T19:27:10.917360
,但不适用于 2017-06-05T19:27:10.917
.
为此目的使用下面的代码
public static String addTrailingZerosToTimestamp(String timeStamp) {
String param = timeStamp;
String newCmitTime = "";
if (param.length() < 26) {
String currentCmitDate = param.substring(0, 10);
if (param.length() <= 11) {
param = currentCmitDate + "T" + "00:00:00.000000";
} else {
String currentCmitTime = param.substring(11, param.length());
String[] timeSplit = currentCmitTime.split("\:|\.");
switch (timeSplit.length) {
case 4:
newCmitTime = currentCmitTime;
break;
case 3:
newCmitTime = currentCmitTime + ".000000";
break;
case 2:
newCmitTime = currentCmitTime + ":00.000000";
break;
case 1:
newCmitTime = currentCmitTime + ":00:00.000000";
break;
case 0:
newCmitTime = currentCmitTime + "00:00:00.000000";
break;
}
param = currentCmitDate + "T" + newCmitTime;
}
} else {
return param;
}
return param;
}
将字符串表示时间戳视为 "2017-06-05T19:27:10.917360"
。但
如果在时间戳上方有连续的尾随零,上游系统会在上面的示例中截断秒和毫秒的零
喜欢 "2017-06 05T19:27:00.000000"
java 中是否有可用的格式化程序以特定格式添加尾随零,包括分隔符如 :
在小时、分钟和秒之间。
例如:"2017-06-05"
应转换为 "2017-06-05T00:00:00.000000"
编辑:- 可以从 HH、MM、SS 的任何字段中截断零。如果时间戳的尾部有一系列零,它将被截断
DateTimeFormatter desiredFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
String truncatedDateTimeString = "2017-06-05T19:27";
LocalDateTime dateTime = LocalDateTime.parse(truncatedDateTimeString);
String fixedDateTimeString = dateTime.format(desiredFormatter);
System.out.println(fixedDateTimeString);
这会打印
2017-06-05T19:27:00.000000
如果分钟和小时也丢失了,那么我们需要更多技巧。查看 DateTimeFormatterBuilder
及其 parseDefaulting
方法。在格式模式字符串中使用方括号 []
将可能缺失的部分括起来。如果时间被截断,我不确定你的字符串会是什么样子——T
也会丢失吗?
另一方面,如果字符串是 2017-06-05T19:27:10.917360
,上面的方法也有效,在这种情况下,只打印相同的字符串。
另外我不确定你真正想解决的是哪个问题。尾随零是多余的,那么它们被截断的问题是什么?
编辑: 下面的方法充实了我所说的 DateTimeFormatterBuilder
,它的 parseDefaulting
方法和格式模式字符串中的方括号:
public static String addTrailingZerosToTimestamp(String timeStamp) {
DateTimeFormatter truncatedFormatter = new DateTimeFormatterBuilder()
.appendPattern("uuuu-MM-dd['T'HH[:mm[:ss[.SSSSSS]]]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.parseDefaulting(ChronoField.NANO_OF_SECOND, 0)
.toFormatter();
DateTimeFormatter desiredFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSSSS");
LocalDateTime dateTime = LocalDateTime.parse(timeStamp, truncatedFormatter);
return dateTime.format(desiredFormatter);
}
它适用于 2017-06-05
、2017-06-05T19
、2017-06-05T19:27
、2017-06-05T19:27:10
和 2017-06-05T19:27:10.917360
,但不适用于 2017-06-05T19:27:10.917
.
为此目的使用下面的代码
public static String addTrailingZerosToTimestamp(String timeStamp) {
String param = timeStamp;
String newCmitTime = "";
if (param.length() < 26) {
String currentCmitDate = param.substring(0, 10);
if (param.length() <= 11) {
param = currentCmitDate + "T" + "00:00:00.000000";
} else {
String currentCmitTime = param.substring(11, param.length());
String[] timeSplit = currentCmitTime.split("\:|\.");
switch (timeSplit.length) {
case 4:
newCmitTime = currentCmitTime;
break;
case 3:
newCmitTime = currentCmitTime + ".000000";
break;
case 2:
newCmitTime = currentCmitTime + ":00.000000";
break;
case 1:
newCmitTime = currentCmitTime + ":00:00.000000";
break;
case 0:
newCmitTime = currentCmitTime + "00:00:00.000000";
break;
}
param = currentCmitDate + "T" + newCmitTime;
}
} else {
return param;
}
return param;
}