代码之家  ›  专栏  ›  技术社区  ›  Tanzeel

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

  •  0
  • Tanzeel  · 技术社区  · 6 年前

    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的unix。 我不知道您使用的是哪种编程语言,但我确信有一些标准模块可以将unixtime转换为您想要的任何格式

    2 回复  |  直到 6 年前
        1
  •  2
  •   Tim Biegeleisen    6 年前

    我不知道您的最终目标是生成一个删除了秒组件的日期对象,还是只想更改时间戳的表示方式来删除秒组件。对于后一种要求,这里可以使用简单的regex替换:

    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
    
        2
  •  0
  •   C. Peck    6 年前

    这应该适用于这个例子;我不知道您是否需要任何时间戳的通用版本——这是可能的,但有点复杂。

    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();
        }
    }
    
        3
  •  0
  •   Anonymous    6 年前

    在程序内部,不要将时间点表示为字符串。使用适当的日期时间对象。分析字符串以获得:

        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得到的字符串是标准的rfc1123/rfc822格式(包括秒,他们不接受打破标准是正确的(尽管iso8601格式可能更合适))。rfc1123/rfc822格式的解析器内置在java.time中,避免了我们自己从格式模式字符串构造解析器。

    OffsetDateTime 而不是 Instant ,并且相同的内置格式化程序仍然有效:

        OffsetDateTime whenWithOffset
                = OffsetDateTime.parse(str, DateTimeFormatter.RFC_1123_DATE_TIME);
        System.out.println(whenWithOffset);
    

    2019-03-18T03:43:55Z

    尾随 Z 在输出中表示UTC,即 与GMT相同(理论上的差异小于1秒)。

        Instant when = DateTimeFormatter.RFC_1123_DATE_TIME.parse(str, Instant::from)
                .truncatedTo(ChronoUnit.MINUTES);
    

    2019-03-18T03:43:00Z

    现在秒设置为0。 truncatedTo 可以用与 偏移日期时间 .

    以用户时区和区域设置向用户演示,无需秒

    我建议您的用户希望在他或她自己的时区中以他或她的文化习惯的格式查看没有秒的日期和时间。例如:

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

    19年3月18日上午9:13

    • 时间已从03:43(GMT)转换为09:13(印度标准时间)。
    • 即使程序中的时间包含秒,它们也不会显示。

    如果要使用JVM的默认格式区域设置,请使用 .withLocale(Locale.getDefault(Locale.Category.FORMAT)) (省略这一部分也完全有效,但我更愿意明确表示我们依赖于默认值)。如果要使用默认时区,请使用 when.atZone(ZoneId.systemDefault()) .

    避免日期和简化格式

    你使用的日期时间类, Date SimpleDateFormat 设计拙劣,过时已久。相反,我使用的是java.time,即现代的java日期和时间API。我觉得和他一起工作好多了。

    链接

    Oracle tutorial: Date Time