我只是将一个模块从旧的Java迁移到新的Java.Time API,并注意到性能下降.它归结为用时区解析日期(我一次解析数百万美元). 没有时区(yyyy/MM/dd HH:mm:ss)的日期字符串的解析快速 - 约2倍,比旧的Java日期快2倍,在我的PC上每秒约150万操作. 但是,当模式包含一个时区(yyyy/MM/dd HH:mm:ss z)时,使用新的java.time API降低了15次,而使用旧的API则差不多,它的速度与没有时区一样快.请参阅下面的性能基准. 是否有人知道我是否可以使用新的java.time API快速解析这些字符串?目前,作为解决方法,我正在使用旧的API进行解析,然后将Date转换为瞬间,这不是特别好. import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.format.DateTimeFormatter; imp
以下是关于 java-time 的编程技术问答
给定这个日期,我想解析:15年12月15日+01:00 使用此代码 Map ordinalNumbers = new HashMap(42); ordinalNumbers.put(1L, "1st"); ordinalNumbers.put(2L, "2nd"); ordinalNumbers.put(3L, "3rd"); ordinalNumbers.put(21L, "21st"); ordinalNumbers.put(22L, "22nd"); ordinalNumbers.put(23L, "23rd"); ordinalNumbers.put(31L, "31st"); for (long d = 1; d
在 DateTimeFormatter 允许完整的停止(.)(周期或点)或逗号(,)作为分数的定界符? 例如,以.0Z或20090813145607.0Z和20090813145607,0Z中的.0Z或,0Z结束的输入日期值来解析以下作品. String input = "20090813145607.0Z"; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmss[,S][.S]X" ); 但是,对于打印,输出包含两个,生成一对重复的分数秒. 20090813145607,0.0z 所以我在格式模式下推断我对[,S][.S]的使用不是获得此功能的正确方法. DecimalStyle 我尝试使用 DateTimeFormatter::withDecimalStyle 方法通过a DecimalStyle ,但这未能像我在实验中所期望的那样行事.该文档并不能真正解释其预期
DateTimeFormatter中可选模式的顺序如何影响解析操作? 我正在运行此程序,想知道为什么最后一行会抛出异常,而不是前三个. public static void main(String[] args) { String p1 = "[EEEE][E] dd-MM-yyyy"; String p2 = "[E][EEEE] dd-MM-yyyy"; String date1 = "Thu 07-01-2016"; String date2 = "Thursday 07-01-2016"; parse(date1, p1); //OK parse(date1, p2); //OK parse(date2, p1); //OK parse(date2, p2); //Exception } private static void parse(String date, String pattern) { DateTimeFormatt
我正在尝试使用java.time来解析以下时间戳字符串03-feb-2014 13:16:31,但它正在丢弃错误.这是我的代码. String timestamp = "03-feb-2014 13:16:31"; DateTimeFormatter format; DateTimeFormatterBuilder formatBuilder = new DateTimeFormatterBuilder(); formatBuilder.parseCaseInsensitive(); formatBuilder.append(DateTimeFormatter.ofPattern("dd-MMM-YYYY HH:mm:ss")); format = formatBuilder.toFormatter(); LocalDateTime localdatetime = LocalDateTime.parse(timestamp, format); 但是我遇到以下错误.
我正在从外部数据源检索日期/时间,以下格式" 14:30 Sat 05 5月5日",没有一年. 我一直在试图将其解析为LocalDateTime失败.返回的数据不会返回一年,因为这是我们始终在当年运行的假设. //date to parse String time = "14:30 Sat 05 May"; //specify date format matching above string DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm E d MMM YYYY") ; //we do not have a year returned but i can make the assumption we use the current year LocalDateTime formatDateTime = LocalDateTime.parse(time, formatter).withYe
我对爪哇时间的时间感到困惑.我长期以来一直在假设下工作,以至于如果将时间戳指定为Zulu时间,Java会在当地时间照顾好偏移. 说明.我目前在BST中,其偏移UTC +1.考虑到这一点,我希望这个Zulu时间: 2016-09-12T13:15:17.309Z 为 2016-09-12T14:15:17.309 解析后局部时间.这是因为我的默认系统时间设置为BST,上面的时间戳(Zulu Time)指定它是UTC时间. 但是,请考虑此样本: String ts = "2016-09-12T13:15:17.309Z"; LocalDateTime parse = LocalDateTime.parse(ts, DateTimeFormatter.ISO_DATE_TIME); System.out.println(parse); 这将打印: 2016-09-12T13:15:17.309
我需要将字符串解析为LocalDate.该字符串看起来像31.* 03 2016在正则术语中(即.*表示一天之后的字符可能有0或更多未知字符). 示例输入/输出:31xy 03 2016 ==> 2016-03-31 我希望在DateTimeFormatter文档中找到通配符语法,以允许以下模式: LocalDate.parse("31xy 03 2016", DateTimeFormatter.ofPattern("dd[.*] MM yyyy")); ,但我找不到任何东西. 是否有一种简单的方法可以用DateTimeFormatter? 表达可选的未知字符 ps:显然我可以在解析字符串之前修改字符串,但这不是我要的. 解决方案 在java.time中没有直接支持. The closest would be to use parse(charsequence,parseposition)使用两个不同的格式. // create the
我正在尝试解析:2014-05-02-10.45.05.993280-5:00其中-5:00是UTC的偏移.使用java.time 在第一位我有以下内容:yyyy-MM-dd-HH.mm.ss.SSSSSS但是,我无法弄清楚应该解析偏移的模式. 如果我有4位数字(-05:00)的偏移,我可以使用:yyyy-MM-dd-HH.mm.ss.SSSSSSxxx,但这对3位数字不起作用. 有什么想法? 解决方案 使用大写字母X代替x,因此xxx.不同之处在于,大X可以识别输入字母" z"为UTC-offset +00:00,而小图案字母x不能. 建议的模式: yyyy-MM-dd-HH.mm.ss.SSSSSSXXX 请注意,以下 java.time.format.datetimeformatter无法用单个解析偏移 数字小时 更新: 我现在已经测试了bug-log中所述的解决方法. String input = "2014-05-02-1
java DateTimeFormatter在尝试超出可能范围的日期时,会引发异常,例如: DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/yyyy"); String dateString = "12/32/2015"; LocalDate ld = LocalDate.parse(dateString, dtf); 将投掷: Exception in thread "main" java.time.format.DateTimeParseException: Text '12/32/2015' could not be parsed: Invalid value for DayOfMonth (valid values 1 - 28/31): 32 但是,当我输入无效的日历日期时,该日期仍然可以按照其标准来进行语法,它会自动化为有效的日期,例如: DateTimeFormatter dtf =
我试图解析dd-MMM-yyyy格式的日期. package com.company; import javax.swing.text.DateFormatter; import java.time.format.DateTimeFormatter; import java.time.*; import java.util.Locale; public class Main { public static void main(String[] args) { // write your code here MonthDay m; Locale.setDefault(Locale.ENGLISH); DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd-MMM-yyyy"); String dateString = "12-jan-
我想知道可以分析时钟时间小时:分钟:Java 8中的第二个? ,例如 final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); final String str = "12:22:10"; final LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 我尝试过,但得到了这个例外: Exception in thread "main" java.time.format.DateTimeParseException: Text '12:22:10' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 12:22:10 of type java.time.format.P
我有这个代码,这是一个简单的字符串,我想将其解析为localdateTime import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; public class DateClass { /** * @param args the command line arguments */ public static void main(String[] args) { String dateRaw = "2019-05-03 7:05:03"; DateTimeFormatter dtf = new DateTimeFormatte
如果我使用d/M/yy之类的模式来创建Java 8 DateTimeFormatter(例如,使用DateTimeFormatter.ofPattern(pattern);(我只用于解析而不是格式化),它将将所有两个字母解释为20xx,例如解析像13/5/99之类的字符串被解释为2099-05-13,在我的情况下是错误的(这是在1999年). 在我的应用程序中,我正在尝试从OCR的文档中解析,例如仍然是90年代的,因此,在当前日期之前的80年及20年内解释日期的旧行为非常适合我.但是由于各种原因,我仍然希望将整个日期解析逻辑切换到新的Java 8 dateTimeFormatters. 浏览Java源代码,我看到这都是相对于常数ReducedPrinterParser.BASE_DATE的解释,但是我认为从模式构建自己的格式化器时,没有办法更改使用的值.这根本是不可能的,还是我错过了指定分析两个字母的行为的可能性? 解决方案 您可以创建一个自定义格式化器,例如d/M/
DateTimeFormatter 班级文档说明了该年度格式代码: u年度2004年; 04 y 2004年; 04 … 年:字母计数确定使用填充的最小场宽度.如果字母计数为两个,则使用缩小的两位数形式.对于打印,这将输出最右边的两个数字.对于解析,这将使用2000年的基本价值来解析,从而在2000年至2099年(包括的)范围内进行一年.如果字母计数少于四个(但不小于两个),则标志仅在signstyle.Sormal.Stresty.mormal的情况下输出.否则,如果超过PAD宽度,则该符号将输出,根据SignStyle.exceeds_pad. 没有其他提及"时代". 那么这两个代码,u vors y,year vors year-of-era? 之间有什么区别 我什么时候应该使用这种模式uuuu-MM-dd以及yyyy-MM-dd在使用Java中的日期时? 看来那些在never中使用的示例代码uuuu,但是为什么? 其他格式课程,
我如何将java 8 OffsetTime和OffsetDateTime用作冬眠作为适当的SQL类型(TIME_WITH_TIMEZONE和TIMESTAMP_WITH_TIMEZONE)? 我找到了LocalTime和LocalDateTime使用EnhancedUserType s in 博客. 用户类型将如何用于 offset 数据? 解决方案 Hibernate Orm 5.3实现JPA 2.2标准. 从 java 8日期和时间API The JPA 2.2 规格说,支持以下Java 8类型: java.time.LocalDate java.time.LocalTime java.time.LocalDateTime java.time.OffsetTime java.time.OffsetDateTime Hibernate Orm支持所有这些类型,甚至更多: java.time.ZonedDateTime java
使用以下代码,每个时区都正确打印值,除了BST import java.text.*; def format = "yyyy-MM-dd HH:mm:ssXXX" def dt = new Date(); println dt; SimpleDateFormat utcFormat = new SimpleDateFormat(format) utcFormat.setTimeZone(TimeZone.getTimeZone("UTC")) println utcFormat.format(dt) SimpleDateFormat istFormat = new SimpleDateFormat(format) istFormat .setTimeZone(TimeZone.getTimeZone("IST")) println istFormat.format(dt) SimpleDateFormat cetFormat = new SimpleDateFormat(
我正在使用最近的java.time软件包,尤其是一周中的日子 localdate的 我得到一个不错的 dayofweek 打电话LocalDate.getDayOfWeek(). 但是,我的代码应与使用日历日的整数值的应用程序的某些较旧的部分兼容,即从代码Calendar.get(DAY_OF_WEEK)获得. 显然,在Dayofweek Enum中,那么,我必须哪些选择将一个转换为彼此?我应该在java.util.date中转换local日期,然后转换为日历? 解决方案 LocalDate.get() ): int sundayBasedDow = date.get(WeekFields.SUNDAY_START.dayOfWeek());
我有一个具有java.time.Instant的实体,用于创建的数据字段: @Getter @Setter @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode public class Item { private String id; private String url; private Instant createdDate; } 我正在使用com.fasterxml.jackson.databind.ObjectMapper将项目保存到Elasticsearch作为JSON: bulkRequestBody.append(objectMapper.writeValueAsString(item)); ObjectMapper将该字段序列化为一个对象: "createdDate": { "epochSecond": 1502643595, "nano":