在下面的代码中。 String str;是来自API的回复。所以我无法改变它。但我想删除秒部分。否则,我将不得不每隔一秒向该API发送一个请求,以保持我的Time小部件更新。如果有任何参数可以获取特定格式的时间戳,我还联系了API开发人员。他们说没有。
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";
Date date=null;
try {
date=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm z").parse(str);
}
catch (ParseException e) {
e.printStackTrace();
}
}
获得例外:无法解析的日期
java.text.ParseException: Unparseable date: "Mon, 18 Mar 2019 03:43:55 GMT"
at java.text.DateFormat.parse(Unknown Source)
at Main.<init>(Main.java:9)
at Main.main(Main.java:17)
API的支持团队回复:
这不是关于地理编码的问题,但有两种方法可以解析日期。 1.使用正则表达式。 2.您可能已经注意到“timestamp”部分中还有一个包含unixtime的created_unix。我不知道您使用的是哪种编程语言,但我确信有一些标准模块可以将unixtime转换为您想要的任何格式
我不知道你的最终目标是实际生成一个删除了秒组件的日期对象,或者你是否只想更改时间戳的显示以删除秒组件。对于后一个要求,一个简单的正则表达式替换可以在这里工作:
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
这适用于这个例子;我不知道你是否想要任何时间戳的通用版本 - 这是可能的,但有点复杂。
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();
}
}
程序内部不代表字符串的时间点。使用正确的日期时间对象。解析字符串以获得一个:
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中传输的信息(在问题的代码中也是如此)。如果偏移值得保留,我们需要OffsetDateTime
而不是Instant
,并且相同的内置格式化器仍然有效:
OffsetDateTime whenWithOffset
= OffsetDateTime.parse(str, DateTimeFormatter.RFC_1123_DATE_TIME);
System.out.println(whenWithOffset);
2019-03-18T03:43:55Z
输出中的尾随Z
表示UTC,它实际上与GMT相同(理论差异小于一秒)。
我建议您询问的秒数不会对您的程序造成任何伤害。我假设您只是想避免将它们呈现给您的用户。如果我错了,当您知道如何:删除秒时很容易:
Instant when = DateTimeFormatter.RFC_1123_DATE_TIME.parse(str, Instant::from)
.truncatedTo(ChronoUnit.MINUTES);
2019-03-18T03:43:00Z
现在秒数设置为0. truncatedTo
可以与OffsetDateTime
以相同的方式使用。
我建议您的用户希望在他或她自己的时区以及他或她的文化中习惯的格式中查看没有秒的日期和时间。例如:
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);
18/03/19,9:13 AM
你发现:
如果你想使用JVM的默认格式化语言环境,请使用.withLocale(Locale.getDefault(Locale.Category.FORMAT))
(省略此部分也完全有用,但我更喜欢明确表示我们依赖于默认值)。如果要使用默认时区,请使用when.atZone(ZoneId.systemDefault())
。
你使用的日期时间类Date
和SimpleDateFormat
的设计很差,而且已经过时了。相反,我使用的是java.time,即现代Java日期和时间API。我觉得这样做更好。
Oracle tutorial: Date Time解释如何使用java.time。