java - 使用 Joda 的 DateTimeFormatter 解析时如何忽略时区?

标签 java parsing jodatime datetime-format

我正在尝试从 IPTC 元数据中解析垃圾日期值。格式应该yyyyMMdd,但在某些情况下并非如此。我发现的一个特定值是“Tue Jan 05 00:00:00 AEDT 2016”

如果我尝试使用 Joda 的 DateTimeFormatter 解析它:

DateTimeFormat.forPattern("EEE MMM dd HH:mm:ss Z yyyy")
              .parseLocalDate("Tue Jan 05 00:00:00 AEDT 2016");

这给了我一个错误:

java.lang.IllegalArgumentException: Invalid format: "Tue Jan 05 00:00:00 AEDT 2016" is malformed at "AEDT 2016"

我尝试过以下区域符号:

  • z
  • zz
  • Z
  • ZZ
  • ZZZ

我意识到文档确实说 DateTimeFormatter 无法解析时区。我还意识到这些短时区名称是不明确的。但在这种情况下,我只是想获取 LocalDate,所以我真正想要的是月、日和年。 (注意到小时、分钟和秒也是零吗?)

如果可能的话,我宁愿不必在传递字符串之前将其从字符串中间进行正则表达式废话,因为我传递此格式化程序的东西需要一个 DateTimeFormatter 目前。

有没有办法指定解析时丢弃的某种任意模式的垃圾?我似乎在 API 中找不到它,但这并不一定意味着它不存在。

最佳答案

同时,我将发布我自己的消息解决方法,它使用现有格式模式的混合以及自定义解析器来丢弃时区。

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .appendPattern("EEE MMM dd HH:mm:ss ")
    .append(DateTimeFormat.forPattern("Z").getPrinter(), new DiscardTimeZoneSymbolParser())
    .appendPattern(" yyyy")
    .toFormatter();

LocalDate localDate = formatter.parseLocalDate("Tue Jan 05 00:00:00 AEDT 2016");

然后:

public class DiscardTimeZoneSymbolParser implements DateTimeParser {
    @Override
    public int estimateParsedLength() {
        return 4;
    }

    @Override
    public int parseInto(DateTimeParserBucket bucket, @NonNls String text, int position) {
        for (int positionFromStart = 0; positionFromStart < 4; positionFromStart++, position++) {
            boolean match;
            if (position >= text.length()) {
                match = false;
            } else {
                @NonNls
                char ch = text.charAt(position);
                match = ch >= 'A' && ch <= 'Z';
            }

            if (!match) {
                if (positionFromStart >= 3) { // require 3 characters
                    return position;
                } else {
                    return ~position;
                }
            }
        }

        return position;
    }
}

关于java - 使用 Joda 的 DateTimeFormatter 解析时如何忽略时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34601626/

相关文章:

java - JodaTime 不会在不匹配的星期几和月份失败

java - 特定使用 Servlet 后将 mysql 列值重置为默认值

java - 无法在 spring 中处理配置类的导入候选

java - 如何避免死锁和使用太多线程?

xml - 如何使用Unmarshal解析XML

parsing - 为什么我不能让手动修改的 MPEG-4 扩展框( block )大小工作?

date - moment.js 第二天返回

java - 为什么我的查询结果返回 false

Java 8 LocalDate-确定无年的 Feb-29 日期的年份?

java - MongoDB 中的日期 : when inserting Date objects into Mongo database, 日期比自身早 1 天