0

我有一个解析 ZonedDateTime 对象的类,.split()用于删除我不想要的所有额外信息。

我的问题:有没有办法使用方括号作为我缺少的分隔符,或者如何在不使用方括号作为分隔符的情况下自行获取时区([US/Mountain])?

我希望字符串时区看起来像“US/Mountian”或“[US/Mountian]

我尝试过的: 我尝试过wholeThing.split("[[-T:.]]?)wholeThing.split("[%[-T:.%]]")但那些都给了我00[US/Mountain]

我也尝试过wholeThing.split("[\\[-T:.\\]])wholeThing.split("[\[-T:.\]")但那些只是给我错误。

(部分)我的代码:

 //We start out with something like   2016-09-28T17:38:38.990-06:00[US/Mountain]

    String[] whatTimeIsIt = wholeThing.split("[[-T:.]]"); //wholeThing is a TimeDateZone object converted to a String
    String year = whatTimeIsIt[0];
    String month = setMonth(whatTimeIsIt[1]);
    String day = whatTimeIsIt[2];
    String hour = setHour(whatTimeIsIt[3]);
    String minute = whatTimeIsIt[4];
    String second = setAmPm(whatTimeIsIt[5],whatTimeIsIt[3]);
    String timeZone = whatTimeIsIt[8];
4

2 回答 2

1

使用split()是正确的想法。

String[] timeZoneTemp = wholeThing.split("\\[");
String timeZone = timeZoneTemp[1].substring(0, timeZoneTemp[1].length() - 1);
于 2016-10-05T03:35:17.360 回答
1

如果您想自己解析字符串,请使用正则表达式来提取值。

不要使用正则表达式来查找要拆分的字符,这就是这样split()做的。

相反,使用带有捕获组的正则表达式,使用 编译它,使用Pattern.compile()获取Matcher输入文本上的a matcher(),并使用 检查它matches()

如果匹配,您可以使用group().

正则表达式示例:

(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}).(\d+)[-+]\d{2}:\d{2}\[([^\]]+)\]

在 Java 字符串中,您必须转义\,所以这里是显示它如何工作的代码:

String input = "2016-09-28T17:38:38.990-06:00[US/Mountain]";

String regex = "(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2}).(\\d+)[-+]\\d{2}:\\d{2}\\[([^\\]]+)\\]";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
    System.out.println("Year    : " + m.group(1));
    System.out.println("Month   : " + m.group(2));
    System.out.println("Day     : " + m.group(3));
    System.out.println("Hour    : " + m.group(4));
    System.out.println("Minute  : " + m.group(5));
    System.out.println("Second  : " + m.group(6));
    System.out.println("Fraction: " + m.group(7));
    System.out.println("TimeZone: " + m.group(8));
} else {
    System.out.println("** BAD INPUT **");
}

输出

Year    : 2016
Month   : 09
Day     : 28
Hour    : 17
Minute  : 38
Second  : 38
Fraction: 990
TimeZone: US/Mountain

更新

您当然可以使用 获得所有相同的值ZonedDateTime.parse(),这也将确保日期有效,这是其他解决方案都无法做到的。

String input = "2016-09-28T17:38:38.990-06:00[US/Mountain]";

ZonedDateTime zdt = ZonedDateTime.parse(input);
System.out.println("Year    : " + zdt.getYear());
System.out.println("Month   : " + zdt.getMonthValue());
System.out.println("Day     : " + zdt.getDayOfMonth());
System.out.println("Hour    : " + zdt.getHour());
System.out.println("Minute  : " + zdt.getMinute());
System.out.println("Second  : " + zdt.getSecond());
System.out.println("Milli   : " + zdt.getNano() / 1000000);
System.out.println("TimeZone: " + zdt.getZone());

输出

Year    : 2016
Month   : 9
Day     : 28
Hour    : 17
Minute  : 38
Second  : 38
Milli   : 990
TimeZone: US/Mountain
于 2016-10-05T03:49:47.280 回答