我使用JAX-RS方法注释创建了一个RESTful Web服务:
@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public MyThing test()
{
MyThing myObject = new MyThing(LocalDateTime.now());
return myObject;
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但我想调整一件事:如果返回的Java对象包含新Java 8 LocalDateTime类型的属性,则表示为JSON对象:
{"myDateTimeProperty":{"hour":14,"minute":32,"second":39,"year":2014,"month":"NOVEMBER","dayOfMonth":6,"dayOfWeek":"THURSDAY","dayOfYear":310,"monthValue":11,"nano":0,"chronology":{"calendarType":"iso8601","id":"ISO"}},...}
Run Code Online (Sandbox Code Playgroud)
如何告诉JAX-RS返回一个JavaScript Date.toJSON() - 样式字符串
{"myDateTimeProperty":"2014-11-07T15:06:36.545Z",...}
Run Code Online (Sandbox Code Playgroud)
代替?
DateTimeFormatter从类似模式创建的Java 8 d. MMM u只能用TextStyle.SHORT定义的样式解析日期(例如13. Feb 2015),从中创建的DateTimeFormatter d. MMMM u只能用TextStyle.FULL定义的样式解析日期(例如13. February 2015).
在"旧的"SimpleDateFormat中,"MMM"和"MMMM"之间的区别仅对格式化很重要,而不是解析,因此很容易创建一个理解月份名称的FULL和SHORT形式的解析器.
是否可以创建一个也可以执行此操作的Java 8 DateTimeFormatter?或者我是否总是要创建两个解析器,一个使用FULL,另一个使用SHORT模式?
我昨天创造了这个精彩的静态方法,它工作得很好 - 昨天
但是,今天它给了我这个错误.我想这是从Z之前的太多0.
任何人都可以推荐如何以简洁的方式(Java 8)解析这种类型的String格式日期 - 请记住它昨天ISO_INSTANT也有效,所以也是一种有效的格式String?
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed
at java.time.LocalDate.from(LocalDate.java:368)
at java.time.LocalDateTime.from(LocalDateTime.java:456)
... 9 more
Run Code Online (Sandbox Code Playgroud)
在输入时间抛出异常:"2015-09-28T14:46:44.000000Z"
/**
*
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z" )
* @return
*/
public static LocalDateTime parseTimeINSTANT(String time) {
DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT;
return LocalDateTime.from(f.parse(time));
}
Run Code Online (Sandbox Code Playgroud)
我需要将以下格式的String解析为2015-01-15-05:00UTC中的LocalDate(或其他).问题是以下代码:
System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE));
Run Code Online (Sandbox Code Playgroud)
输出2015-01-15忽略偏移量.期望的输出是2015-01-16
提前致谢!
请建议是否有API支持来确定我的时间是在两个LocalTime实例之间,还是建议采用不同的方法.
我有这个实体:
class Place {
LocalTime startDay;
LocalTime endDay;
}
Run Code Online (Sandbox Code Playgroud)
它存储工作日的开始和结束时间,即从'9:00'到'17:00',或者从'22:00'到'5:00'的夜总会.
我需要实现一个Place.isOpen()方法来确定该地点是否在给定时间打开.
这里简单isBefore/ isAfter不起作用,因为我们还需要确定结束时间是否在第二天.
当然,我们可以比较开始和结束时间并做出决定,但我想要一些没有额外逻辑的东西,只需要一个简单的between()调用.如果LocalTime不足以达到此目的,请另外建议.
我试图使用LocalDateTime来设置下一个String,但我总是得到de unparsed text found错误:
Error java.time.format.DateTimeParseException: Text '2016-08-18 14:27:15.103+02' could not be parsed, unparsed text found at index 10
Run Code Online (Sandbox Code Playgroud)
这是我的字符串:convertDate:' 2016-08-18 14:27:15.103 + 02 '
我的代码:
public static LocalDate conversorStringToLocalDateTime(String convertDate) throws ParseException {
LocalDate dateTime =LocalDate.parse(convertDate);
return dateTime;
}
Run Code Online (Sandbox Code Playgroud)
我猜不是太复杂,买我不能看到错误.字符串中的+02可能是原因吗?
我正在查看Java 8的新日期时间包的教程.在关于DayOfWeek和Month枚举的页面上,它表示DayOfMonth枚举从星期一到星期日.这是为什么?我使用的每个其他系统(包括.NET)都在周日开始.
我希望从我的项目中删除Joda-Time库.
我想把两位数转换成全年.Joda-Time的以下代码可以实现此目的.以下是joda-time的以下代码
DateTimeFormatter TWO_YEAR_FORMATTER = DateTimeFormat.forPattern("yy");
int year = LocalDate.parse("99"", TWO_YEAR_FORMATTER).getYear();
System.out.println(year);
Run Code Online (Sandbox Code Playgroud)
产出:1999年
这是我期望的输出,这在我的情况下是有意义的.但是,当我使用java.time API尝试相同的过程时,它会生成DatetimeParseException.以下是java.time API的以下代码:
DateTimeFormatter TWO_YEAR_FORMATTER = DateTimeFormatter.ofPattern("yy");
int year = LocalDate.parse("99", TWO_YEAR_FORMATTER).getYear();
System.out.println(year);
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
Exception in thread "main" java.time.format.DateTimeParseException: Text '99' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2099},ISO of type java.time.format.Parsed
at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
at java.base/java.time.LocalDate.parse(LocalDate.java:428)
at scratch.main(scratch.java:10)
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {Year=2099},ISO of type java.time.format.Parsed
at java.base/java.time.LocalDate.from(LocalDate.java:396)
at java.base/java.time.format.Parsed.query(Parsed.java:235)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
... 2 more
Run Code Online (Sandbox Code Playgroud)
我没能看到堆栈跟踪的原因.如果有人可以帮助我理解以下场景并且还解释如何使用Java 8时间API将两位数年份转换为全年,那将是很好的.
在Java类中,java.time.Period该方法normalized()的Javadoc中包含以下内容:
这将使年和月单位标准化,而使天单位保持不变。
超类的方法在其Javadoc中具有以下内容:
规范化过程特定于每个日历系统。例如,在ISO日历系统中,年和月被标准化,而天未被标准化,[...]
我无权访问ISO 8601-1:2019的实际文本,也不想在上面花费数百个[在此处插入货币](我想标准化可能在第1部分中描述:基本规则而不是在第2部分:扩展中)。
有人可以阐明为什么Period#normalized()不使天数正常化吗?它是否真的直接来自ISO 8601本身,是在其他地方指定的,还是仅特定于Java实现的?