3 回答

TA贡献1831条经验 获得超10个赞
我不知道您的最终目标是实际生成一个删除了秒组件的日期对象,还是只想更改时间戳的表示形式以删除秒组件。对于后一种要求,一个简单的正则表达式替换可以在这里工作:
String str = "Mon, 18 Mar 2019 03:43:55 GMT";
str = str.replaceAll("(?<=\\d):\\d{2}(?=\\s)", "");
System.out.println(str);
Mon, 18 Mar 2019 03:43 GMT

TA贡献1895条经验 获得超7个赞
这应该适用于此示例;我不知道你是否想要任何时间戳的通用版本 - 这是可能的,但有点复杂。
Main() {
//assume that timestamp reply from the API is being stored in 'str'
//now we've to remove :55 from str
String str = "Mon, 18 Mar 2019 03:43:55 GMT";
str = str.replace(":55", "");
Date date=null;
try {
date=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm z").parse(str);
}
catch (ParseException e) {
e.printStackTrace();
}
}

TA贡献1856条经验 获得超5个赞
java.time 和一个正确的 datetime 对象,而不是一个字符串
在程序内部,不要将时间点表示为字符串。使用正确的日期时间对象。解析字符串以获取一个:
String str = "Mon, 18 Mar 2019 03:43:55 GMT";
// Parse for internal use
Instant when = DateTimeFormatter.RFC_1123_DATE_TIME.parse(str, Instant::from);
System.out.println(when);
2019-03-18T03:43:55Z
您从API获得的字符串采用标准的RFC 1123 / RFC 822格式(包括秒,并且它们接受不违反标准是正确的(尽管ISO 8601格式可能更合适))。RFC 1123 / RFC 822格式的解析器内置于java.time中,使我们不必从格式模式字符串中自行构建它。
我假设时间点是这里的重要信息,并丢弃了它在GMT中传输的信息(在问题中的代码中也发生了同样的事情)。如果偏移量值得保留,我们需要 一个 而不是 一个 ,并且相同的内置格式化程序仍然有效:OffsetDateTimeInstant
OffsetDateTime whenWithOffset
= OffsetDateTime.parse(str, DateTimeFormatter.RFC_1123_DATE_TIME);
System.out.println(whenWithOffset);
2019-03-18T03:43:55Z
输出中的尾随表示 UTC,这实际上与 GMT 相同(理论差异小于一秒)。Z
我建议你问的秒数不会对你的程序造成任何伤害。我假设您只想避免将它们呈现给您的用户。如果我错了,当您知道如何操作时,删除秒很容易:
Instant when = DateTimeFormatter.RFC_1123_DATE_TIME.parse(str, Instant::from)
.truncatedTo(ChronoUnit.MINUTES);
2019-03-18T03:43:00Z
现在秒数设置为 0。 可以以与 .truncatedToOffsetDateTime
以用户的时区和区域设置呈现给用户,无需几秒钟
我建议你的用户希望在他或她自己的时区中以他或她的文化中习惯的格式查看没有秒的日期和时间。例如:
DateTimeFormatter formatter
= DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT)
.withLocale(Locale.forLanguageTag("en-IN"));
ZonedDateTime whenInUsersTimeZone = when.atZone(ZoneId.of("Asia/Kolkata"));
String formatted = whenInUsersTimeZone.format(formatter);
System.out.println(formatted);
2019/03/18 上午9:13
您注意到:
时间已从 03:43 (GMT) 转换为 09:13 (印度标准时间)。
即使程序中的时间包含秒,也不会显示它们。
如果你想使用JVM的默认格式语言环境,请使用(省略这部分也完全有效,但我更喜欢明确我们依赖于默认值)。如果要使用默认时区,请使用 。.withLocale(Locale.getDefault(Locale.Category.FORMAT))when.atZone(ZoneId.systemDefault())
避免日期和简单日期格式
您使用的日期时间类 和 的设计很差,而且早已过时。相反,我使用的是java.time,即现代Java日期和时间API。我发现使用它要好得多。DateSimpleDateFormat
添加回答
举报