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

如何从模式中创建Java时间瞬间?

茅曾琪
2023-03-14

考虑代码:

TemporalAccessor date = DateTimeFormatter.ofPattern("yyyy-MM-dd").parse("9999-12-31");
Instant.from(date);

最后一行抛出一个异常:

Unable to obtain Instant from TemporalAccessor: {},ISO resolved to 9999-12-31 of type java.time.format.Parsed

如何从yyyy-MM-dd模式创建即时

共有3个答案

越飞翮
2023-03-14
public static void main(String[] args) throws ParseException {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse("2016-12-31").toInstant());
}

上述代码给出了以下输出:

2016-12-31T00:00:00Z

我已经回答了这个问题使用功能('toInstant'方法)的java 8.

蓬威
2023-03-14

问题不在于您使用的是年份9999。Instant. MAX字段的计算值为时间戳1000000000-12-31T23:59:59.999999999Z,因此9999作为年份是可以的。

处理TemporalAccess,而不是像LocalDateTimeZonedDateTime这样语义上更丰富的类型,就像使用Map来建模对象及其属性,而不是编写-您必须确保该值具有接收它的对象所期望的字段(如秒、纳秒等),而不是依赖于更高级别类中的正式声明的操作,以防止依赖关系得不到满足。

在您的情况下,时间访问器很可能包含给定的解析日期字段,但没有Instant需要的“秒”字段。在大多数情况下,最好使用语义更丰富的类型,如LocalDateTime

因为只有日期字段,所以应该将其解析为日期,然后在将其转换为即时之前添加时间字段。下面是一种使用LocalDate解析日期的方法:

LocalDate localDate = LocalDate.parse("2016-04-17");
LocalDateTime localDateTime = localDate.atStartOfDay();
Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
吉鸿宝
2023-03-14

字符串“9999-12-31”只包含有关日期的信息。它不包含关于一天中的时间或偏移量的任何信息。因此,没有足够的信息来创建即时。(其他日期和时间库更为宽松,但java.time避免默认这些值)

你的第一选择是使用LocalDate而不是“即时:

LocalDate date = LocalDate.parse("9999-12-31");

您的第二个选择是对日期进行后期处理,将其转换为瞬间,这需要一个时区,此处选择巴黎:

LocalDate date = LocalDate.parse("9999-12-31");
Instant instant = date.atStartOfDay(ZoneId.of("Europe/Paris")).toInstant();

第三个选择是将时区添加到格式化程序中,并默认一天中的时间:

static final DateTimeFormatter FMT = new DateTimeFormatterBuilder()
    .appendPattern("yyyy-MM-dd")
    .parseDefaulting(ChronoField.NANO_OF_DAY, 0)
    .toFormatter()
    .withZone(ZoneId.of("Europe/Paris"));
Instant instant = FMT.parse("9999-31-12", Instant::from);

(如果这不起作用,请确保您拥有最新的JDK 8版本,因为这方面的错误已经修复)。

值得注意的是,这些可能性中没有一种直接使用TemporalAccessor,因为这种类型是一种低级框架接口,大多数应用程序开发人员无法使用。

 类似资料:
  • 问题内容: 我用来将Java对象序列化/反序列化为json。我想在中显示它,并且需要一个架构来做出更好的描述。这将允许我编辑对象并添加比实际更多的数据。 可以提供json模式吗? 是否有其他框架具有该功能? 问题答案: Gson库可能不包含类似的功能,但是您可以尝试使用Jackson库和jackson- module-jsonSchema 模块解决您的问题。例如,对于以下类别: 这个程序: 打印以

  • 我在应用程序中有一个编辑文本字段,用户可以手动插入时间,我想匹配适当的日期模式,如用户可以输入这种格式的时间,只有当它不是在给定的格式,然后它显示错误。我如何才能使这个功能的模式匹配器。我不知道如何实现这个功能。有人请让我知道如何才能实现这个功能,任何帮助都将不胜感激。 谢谢

  • 因此,我的任务是创建一个 Time 类,该类保存一小时值和一分钟值来表示时间。我将使用“军事时间”,因此12:01 am是0001,1 pm是1300。我可以假设有效的军事时间范围从0000到2359。有效标准时间范围为上午 12:00 至晚上 11:59。时间应包括两个构造函数: Time() -将时间设置为1200的默认构造函数。Time(int h,int m) -如果h介于1和23之间,则

  • 如何使用Spark Java中的StructType为以下数据定义数据类型? 字段包括:姓名、地址、ID、REPORTCARD 我有以下代码: 现在,我需要使用以下行将javaRDD转换为数据帧(数据集df): 我需要为此创建StructType架构。如何在Spark Java中定义它。 我创建了以下StructType模式: 但我得到了以下例外:

  • 我将JSON文件&JSON模式解析为AVRO模式。我有点困惑,我是否必须使用AVRO文档中定义的数据类型来编写手动AVRO模式。 或者是否有任何自动化的方法/函数/程序可以完全按照要求工作?

  • 在firebase文档中,它说我可以从以下代码片段firebase.database.servervalue.timestamp中获得服务器时间戳值 我如何为Swift 3写这个?