有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (1) 个答案

  1. # 1 楼答案

    爪哇。时间

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
                "EEE MMM dd uuuu HH:mm:ss 'GMT'xx (zzzz)", Locale.ENGLISH);
        String str = "Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)";
        TemporalAccessor parsed = formatter.parse(str);
        ZonedDateTime zdt = ZonedDateTime.from(parsed);
        // Check the offset against the time zone for validation
        ZoneOffset offset = ZoneOffset.from(parsed);
        if (offset.equals(zdt.getOffset())) {
            System.out.println(zdt);
        } else {
            System.err.println("Offset doesn’t match");
        }
    

    此代码段的输出为:

    2019-09-14T00:00+05:30[Asia/Kolkata]

    不要使用SimpleDateFormatDate。这些课程设计拙劣,而且早已过时。相反,我使用的是java。时间,现代Java日期和时间API。和你一起工作真是太好了

    验证为王如果有一天你收到一个偏移量(如+0530-0400)与时区(如India Standard TimeAustralian Central Daylight Time)不一致的字符串,你需要发现并采取适当的措施。因此,我将从解析的日期时间中取出偏移量,并将其与Java从时区派生的偏移量进行比较。在这种情况下,他们确实同意了。如果不是出于验证的需要,解析ZonedDateTime的正常方法将是更简单的:

        ZonedDateTime zdt = ZonedDateTime.parse(str, formatter);
    

    指定区域设置SatSepIndia Standard Time是英文的。如果不确保使用英语语言环境进行解析,解析可能会失败。如果不是今天,那么有一天当你在一台具有不同语言环境设置的计算机上运行你的程序时

    你的代码出了什么问题

    格式模式字符串中有几个错误。虽然从SimpleDateFormat得到的错误消息非常普遍,但java。时间有时更有用。看看能不能帮上忙。使用格式模式字符串:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd hh:mm:ss Z yyyy", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(str, formatter);
    

    这让我们有了一个

    java.time.format.DateTimeParseException: Text 'Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)' could not be parsed at index 13

    索引13已经很重要了。字符串中的索引13是2019中的19所在的位置。parse方法使用您的格式模式来解析字符串,并已成功解析Sat Sep 14 20,因为它匹配E MMM dd hh。它知道一个小时只能是两个数字,所以只将20解析为小时,然后解析对象,因为格式模式在小时之后指定了一个冒号,而20之后没有任何冒号。您可能已经看到,我们应该在格式模式中指定uuuuyyyy之后的年份。让我们修复,移动字符串中的yyyy

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss Z", Locale.ENGLISH);
    

    java.time.format.DateTimeParseException: Text 'Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)' could not be parsed at index 25

    我们大约是现在的两倍。索引25是GMT+0530所在的位置。所以这与格式模式字母Z不匹配。文件上说Z代表区域偏移,例如+0000-0800; -08:00. 您的字符串在偏移量前面有GMT。我们通过将其转义为包含在单引号中的文本来解决它:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss 'GMT'Z", Locale.ENGLISH);
    

    java.time.format.DateTimeParseException: Text 'Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)' could not be parsed, unparsed text found at index 33

    索引33是^{之后的空格。格式模式字符串到此结束。有一种方法可以指示解析只解析尽可能多的字符串,但这将剥夺我们对时区的验证,所以我们不要求助于此。小写z代表时区名称:

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy hh:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH);
    

    java.time.format.DateTimeParseException: Text 'Sat Sep 14 2019 00:00:00 GMT+0530 (India Standard Time)' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {NanoOfSecond=0, MinuteOfHour=0, MilliOfSecond=0, MicroOfSecond=0, OffsetSeconds=19800, HourOfAmPm=0, SecondOfMinute=0},ISO,Asia/Kolkata resolved to 2019-09-14 of type java.time.format.Parsed

    这是一个新的。需要注意的细节是HourOfAmPm=0。我们不打算在上午或下午安排一个小时,只安排一天中的一个小时。错误是小写的hh表示小时。对于从00到23的小时,我们需要大写^{

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("E MMM dd yyyy HH:mm:ss 'GMT'Z (zzzz)", Locale.ENGLISH);
    

    现在解析成功,并给出与上面相同的结果。我想说的是java。时间正在更努力地帮助我们获得正确的格式模式

    链接