为了账号安全,请及时绑定邮箱和手机立即绑定

使用 java 从 API 回复中删除秒数

使用 java 从 API 回复中删除秒数

拉莫斯之舞 2022-08-17 12:25:02
在下面的代码中。字符串 str;是来自 API 的回复。所以我不能改变它。但我想从中删除秒部分。否则,我必须每秒向该API发送一个请求,以保持我的时间小部件更新。如果有任何参数可以获取特定格式的时间戳,我还联系了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.您可能已经注意到在“时间戳”部分中还有一个包含unixtime created_unix。我不知道你使用的是哪种编程语言,但我确信有标准模块可以将unixtime转换为您想要的任何格式
查看完整描述

3 回答

?
慕哥6287543

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


查看完整回答
反对 回复 2022-08-17
?
人到中年有点甜

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();

    }

}


查看完整回答
反对 回复 2022-08-17
?
RISEBY

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


查看完整回答
反对 回复 2022-08-17
  • 3 回答
  • 0 关注
  • 116 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号