当前位置: 首页 > 面试题库 >

Java 6对ISO 8601格式的通用支持

孟泽宇
2023-03-14
问题内容

Java 7 SimpleDateFormat通过字符X(而不是大写或小写Z)引入了对ISO 8601格式的支持。在Java
6中支持此类格式需要进行预处理,因此最好的方法就是问题。

此新格式是Z(大写字母Z)的超集,还有2个其他变体:

  1. “分钟”字段是可选的(即有效的是2位数而不是4位数的时区)
  2. 冒号(’:’)可用于将两位数字的“小时”字段与两位数字的“分钟”字段分开。

因此,从Java
7文档的SimpleDateFormat
可以看到,以下三种格式现在有效(而不是ZJava
6 所涵盖的第二种格式),并且当然是等效的:

  1. -08
  2. -0800
  3. -08:00

正如前面有关支持这种“扩展”时区格式的特殊情况的问题中所讨论的,始终以“:”作为分隔符,将Java 7功能回移植到Java
6的最佳方法是对类进行子SimpleDateformat类化并覆盖其parse()方法。 ,即:

public Date parse(String date, ParsePosition pos)
{
    String iso = ... // Replace the X with a Z timezone string, using a regex

    if (iso.length() == date.length())
    {
        return null; // Not an ISO 8601 date
    }

    Date parsed = super.parse(iso, pos);

    if (parsed != null)
    {
        pos.setIndex(pos.getIndex()+1); // Adjust for ':'
    }

    return parsed;
}

注意,SimpleDateFormat上面的子类对象必须使用相应的Z基于模式的对象进行初始化,即,如果子类是,ExtendedSimpleDateformat并且您想解析符合该模式的日期yyyy- MM-dd'T'HH:mm:ssX,则应使用实例化为

new ExtendedSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

在前面提到的前面的问题中,:(?=[0-9]{2}$)建议使用正则表达式来消除“:”,而在类似的问题中,(?<=[+-]\d{2})$建议根据需要将正则表达式用于附加“分钟”字段00

显然,成功运行2个替换可以用于实现全部功能。因此,iso覆盖parse()方法中的局部变量将设置为

iso = date.replaceFirst(":(?=[0-9]{2}$)","");

要么

iso = iso.replaceFirst("(?<=[+-]\\d{2})$", "00");

进行if检查,以确保pos稍后也正确设置了该值,并且也为了length()早先进行了比较。

问题是:我们可以使用 单个正则表达式 来达到相同的效果,包括不需要不必要地检查长度以及pos稍后正确设置几行所需的信息吗?

该实现适用于读取大量字符串字段的代码,这些字符串字段可以采用任何格式(甚至完全不是日期),仅选择符合该格式的字符串字段并返回已解析的JavaDate对象。

因此, 准确性速度 都是至关重要的(即,如果使用两次通过速度更快,则此方法更可取)。


问题答案:

似乎可以使用此:

import java.util.Calendar;
import javax.xml.bind.DatatypeConverter;

public class TestISO8601 {
    public static void main(String[] args) {
        parse("2012-10-01T19:30:00+02:00"); // UTC+2
        parse("2012-10-01T19:30:00Z");      // UTC
        parse("2012-10-01T19:30:00");       // Local
    }
    public static Date parse(final String str) {
        Calendar c = DatatypeConverter.parseDateTime(str);
        System.out.println(str + "\t" + (c.getTime().getTime()/1000));
        return c.getTime();
    }
}


 类似资料:
  • Java7在类中引入了对ISO 8601格式的支持,通过字符(而不是大小写)。在Java6中支持这样的格式需要预处理,所以最好的方法就是这个问题。 这个新格式是(大写Z)的超集,还有两个其他变体: null null 请注意,上面的子类对象必须使用相应的基于模式进行初始化,也就是说,如果子类是,并且您希望解析符合模式的日期,那么您应该使用实例化为 在前面提到的问题中,建议使用regex来去掉“:”

  • 问题内容: 我正在使用bootstrap-datetimepicker和ISO8601 datetime格式,如其选项部分所述 在我的控制器中 它以(console.log)将数据发送到后端 并保存为数据库 在我的模板中 我在HTML上看到的输出为 但是根据Angular doc,它应该用于格式 我想念的是什么? 问题答案: 现在,我已经创建了一个过滤器 作为依赖项添加为 并用作 并将日期显示为

  • 有没有办法将ISO8601日期与Java进行比较?比如,知道字符串日期是否是良好的格式,知道月份是否为负数,以及 我还在搜索如何知道互联网上是否有课程可以比较两个ISO8601日期?比如,如果我有:2000-12-12和1999-05-06。我如何比较这两个日期,使之在年、月和日之间有准确的差异?

  • 本文向大家介绍PowerShell中iso8601格式日期和DateTime对象互转实例,包括了PowerShell中iso8601格式日期和DateTime对象互转实例的使用技巧和注意事项,需要的朋友参考一下 一、iso8601格式转换成DateTime对象 这里主要用到datetime的静态方法static datetime ParseExact(string s, string format

  • Three.js有一系列导入外部文件的辅助函数,是在three.js之外的,使用前需要额外下载,在https://github.com/mrdoob/three.js/tree/master/examples/js/loaders可以找到。 *.obj是最常用的模型格式,导入*.obj文件需要OBJLoader.js;导入带*.mtl材质的*.obj文件需要MTLLoader.js以及OBJMTL

  • 我想用haar cascade数数汽车。 我将图像正确地转换为灰度,并成功地在框架上画了一条线。问题是我得到了这个错误 错误:OpenCV(3.4.2)C:\build\3\u 4\u winpack-bindings-win32-vc14-static\OpenCV\modules\imgproc\src\contours。cpp:199:错误:(-210:不支持的格式或格式组合)[Start]