我试图在检查网页上的时间戳值之前和之后捕捉时间,然后确认我的时间戳介于这些时间之间。然而,我正在努力以一种干净的方式将我的字符串时间戳转换为类似的格式。
Instant b4 = Instant.now();
//My code submites a file that then triggers the timestamp. I retrieve it as a string
//exa string"9/25/2020, 11:03:18 AM"
DateTimeFormatter dtf = DateTimeFormatter
.ofPattern("MM/dd/yyyy, HH:mm:ss a")
.withZone(ZoneId.systemDefault());
Instant instantTimestamp = Instant.from(dtf.parse(timeStamp));
Instant after = Instant.now();
if (instantTimestamp.isAfter(b4) && instantTimestamp.isBefore(after)) {
testPass = true;
}
Assert.assertTrue(testPass);
我的错误:java.time.format.DateTimeParseException:无法在索引0 处解析文本"9/25/2020,12:46:00 PM">
错误是由于使用的格式字符串造成的"MM";要求输入字符串的月份部分正好是两位数长;9〃;只有一位数字。换句话说,它适用于";09/25/2020上午11:03:18";,但不适用于";2020年9月25日上午11:03:18";。
这里需要的是";M";,其不要求该值前面加上"0";0〃:
DateTimeFormatter dtf = DateTimeFormatter
.ofPattern("M/dd/yyyy, HH:mm:ss a")
.withZone(ZoneId.systemDefault());
如果日期也应允许为个位数,而不是0-9天的0填充,则应使用"M/d/yyyy, HH:mm:ss a"
模式。
这是描述DateTimeFormatter
Javadocs:
所有字母"A"到"Z"以及"A"到"Z"都保留为模式字母。定义了以下模式字母:
Symbol Meaning Presentation Examples ------ ------- ------------ ------- [...] M/L month-of-year number/text 7; 07; Jul; July; J [...]
文本:[…]
数字:如果字母数为1,则使用最小位数输出该值,不使用填充。否则,位数将用作输出字段的宽度,并根据需要填充值零。[…]
数字/文本:如果模式字母的计数为3或更大,请使用上面的文本规则。否则,请使用上面的数字规则。
由于"M〃;使用";数字/文本";如果它的字母数是2,那么它需要两位数字来表示月份。将其切换为单个";M〃;使其使用最小位数(一位数表示1-9个月,两位数表示10-12个月(。
月份的格式与其字符串中的值不匹配。格式为指定两位数字的MM
,但值为单个数字的9
。您可以使用单个字母表示月、日、年、小时、分钟、秒等,以容纳所有允许的数字。此外,我建议您以不区分大小写的方式解析它,以便可以同时容纳大写和小写(例如AM
和am
(。
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
// Given date-time string
String dateTimeString = "9/25/2020, 12:46:00 PM";
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("M/d/u, h:m:s a")
.toFormatter(Locale.ENGLISH);
// Convert the given date-time string to LocalDateTime
LocalDateTime ldt = LocalDateTime.parse(dateTimeString, dtf);
System.out.println(ldt);
// Convert to LocalDateTime Instant if required
Instant instant = ldt.toInstant(ZoneOffset.UTC);
System.out.println(instant);
}
}
输出:
2020-09-25T12:46
2020-09-25T12:46:00Z
在线演示
如果此日期时间所属的时区与UTC不同,请将其转换为Instant
到ZonedDateTime
,例如
Instant instant = ldt.atZone(ZoneId.of("America/Los_Angeles")).toInstant();
从跟踪:日期时间了解有关现代日期时间API的更多信息。