当前位置: 首页 > 知识库问答 >
问题:

如何在一个DateTimeFormater Java8中处理所有区域偏移量

羿季
2023-03-14

我需要为以下有效日期创建DateTimeFormatter

  String date1 = "2017-06-20T17:25:28";
  String date2 = "2017-06-20T17:25:28.477777";
  String date3 = "2017-06-20T17:25:28.477777Z";
  String date4 = "2017-06-20T17:25:28.477777UTC";
  String date5 = "2017-06-20T17:25:28.477777-05";
  String date6 = "2017-06-20T17:25:28.477777+05";
  String date7 = "2017-06-20T17:25:28.477777+05:30";
  String date8 = "2017-06-20T17:25:28.477777-05:30";
  String date9 = "2017-06-20T17:25:28.477777+0530";
  String date10 = "2017-06-20T17:25:28.477777-0530";

我尝试了以下日期时间格式化程序,但在最近两个日期(date9date10)中失败。

private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
    .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
    .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
                        .optionalStart().appendZoneId().optionalEnd()
                        .optionalStart().appendOffset("+HH", "+00").optionalEnd()
                        .optionalStart().appendOffset("+HH:mm", "+00:00").optionalEnd()
                        .optionalStart().appendOffset("+HHmm", "+0000").optionalEnd().toFormatter();

date1date8的所有日期都可以正常工作,但在尝试分析最近两个日期时,我得到一个dateTimeParseException:

线程“main”java.time.format.DateTimeParseException中出现异常:无法解析文本“2017-06-20T17:25:28.477777+0530”,在索引29处找到未解析的文本

用于解析我正在使用的日期。

LocalDateTime.parse(date1, DATE_TIME_FORMATTER);

offsetidprinterparser偏移的有效模式:

static final class OffsetIdPrinterParser implements DateTimePrinterParser {
        static final String[] PATTERNS = new String[] {
            "+HH", "+HHmm", "+HH:mm", "+HHMM", "+HH:MM", "+HHMMss", "+HH:MM:ss", "+HHMMSS", "+HH:MM:SS",
        };  // order used in pattern builder

我不能理解当我使用有效的ZoneOffset模式时,为什么我的最后两个日期失败。

共有1个答案

曾奇略
2023-03-14

另一种选择是使用由[]和相应偏移模式(VVX)分隔的可选部分:

DATE_TIME_FORMATTER = DateTimeFormatter
                         // pattern with optional sections: fraction of seconds and offsets
                         .ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][VV][x][xx][xxx]");

每对[]都等效于一个OptionalStartOptionalEnd节。注意,我还必须包含大写的s(秒的分数)作为可选,以解析不存在此字段的情况。

其他模式(vvx)对应于您需要的各种偏移量。从Javadoc:

Pattern  Count  Equivalent builder methods
-------  -----  --------------------------
  VV      2      appendZoneId()
  x       1      appendOffset("+HHmm","+00")
  xx      2      appendOffset("+HHMM","+0000")
  xxx     3      appendOffset("+HH:MM","+00:00")

这适用于所有输入日期。

唯一的区别是[.ssssss]在“秒的分数”字段中正好接受6位数字(或零位数字,因为它是可选部分),而appendfract接受0到6位数字的任意数量。要获得完全相同的行为,必须使用DateTimeFormatterBuilder:

DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
    // date and time
    .appendPattern("yyyy-MM-dd'T'HH:mm:ss")
    // fraction of seconds, from 0 to 6 digits
    .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
    // optional offset patterns
    .appendPattern("[VV][x][xx][xxx]")
    .toFormatter();
 类似资料:
  • 在我的网站中,用户A创建了一个从上午9:00开始的事件。我将该时间转换为GMT,这样,如果用户B在两小时前的不同时区看到该事件,它可以转换为用户B的时区,并显示该事件在11:00AM开始。 我唯一的想法是,当我得到如下所示的时区偏移量时,我是否应该总是将日期设置为一月,以便无论实际月份如何,我总是得到相同的时区偏移量?或者有没有更好的方法来处理这件事?

  • 我使用的是spring data 1.5.8和Kafka的手动确认模式。只有一个简单的ErrorHandler接口,handle方法有参数exception和consumerRecord,但是如果json无法反序列化时抛出异常,我如何将偏移量设置为next?我需要省略这条信息,否则消费者会被卡在那里 spring data 2.0引入ConsumerRawareErrorHandler,唯一的方法

  • 问题内容: 我需要下一个流程: nodejs utils api中有这种可能性吗? 问题答案: 您可以使用node-time,如下所示:

  • 我开发了一个Spring批处理作业,它使用KafkaItemReader类读取Kafka主题。我只想在处理在定义块中读取的消息并将其成功写入输出时提交偏移量。dat文件。 ============================================================================== ===================================

  • 下面是从kafka主题(8分区)接收消息并对其进行处理的消费者代码。 如果处理逻辑中没有返回错误,则所有工作都按预期进行。 但是,如果我抛出一个错误来模拟特定消息的处理逻辑中的异常行为,那么我就没有处理导致异常的消息。流将移动到下一条消息。 我想要实现的是,处理当前消息并提交偏移量,如果它成功,然后移动到下一个记录。 问候, 维诺特

  • 当我这样创作的时候: 一切都工作得很好,但我尽量避免转换。是否可以通过只使用对象来实现这一点?