考虑以下代码:
Date date = new SimpleDateFormat("MMddyyyy").parse("01011500");
LocalDate localDateRight = LocalDate.parse(formatter.format(date), dateFormatter);
LocalDate localDateWrong = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();
System.out.println(date); // Wed Jan 01 00:00:00 EST 1500
System.out.println(localDateRight); // 1500-01-01
System.out.println(localDateWrong); // 1500-01-10
Run Code Online (Sandbox Code Playgroud)
我知道1582年是Julian和Gregorian日历之间的截止点.我不知道为什么会发生这种情况,或者如何调整它.
这是我到目前为止所发现的:
BaseCalender设置为的日期JulianCalendardate.toInstant() 回来 Instant.ofEpochMilli(getTime())date.getTime() 返回-14830974000000所以似乎要么返回的毫秒getTime()是错误的(不太可能),要么与我预期的不同,我需要考虑差异.
Java 8引入了java.time.Clock接口,它应该允许我有效地模拟系统时间调用(太棒了!).
我想天真地替换调用System.currentTimeMillis()与调用someClock.millis(),但目前尚不清楚,我认为这两个时钟实际上将根据给定的caviet所有情况下返回相同的价值观Clock.system*,他们使用"的状态文档...最好的系统时钟". System.currentTimeMillis()没有说明使用最佳可用时钟的任何类似声明.
我想替换JodaTime的Java 8 DateTime API.
我有ISO-8601句号描述=P2W5DT11H8M
在JodaTime我通过执行以下代码非常简单地解析它:
Period.parse("P2W5DT11H8M")我得到了成功的Period对象.
我可以在Java 8中做同样的事情吗?
我正在尝试将日期时间字符串解析为LocalDateTime.但是,如果我发送所有大写月份的一个错误,是否有任何解决方法.这是下面的代码
@Test
public void testDateFormat(){
DateTimeFormatter formatter= DateTimeFormatter.ofPattern("dd-MMM-yyyy HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse("04-NOV-2015 16:00:00", formatter); //if I send month Nov it works
System.out.println(dateTime.getYear());
}
Run Code Online (Sandbox Code Playgroud)
同样适用于simpleDateFormat
@Test
public void testSimpleDateTime() throws ParseException{
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
Date dateTime = format.parse("04-NOV-2015 16:00:00");
System.out.println(dateTime.getTime());
}
Run Code Online (Sandbox Code Playgroud) 阅读Instant类的源代码,我碰到了这个方法
/**
* Defend against malicious streams.
*
* @param s the stream to read
* @throws InvalidObjectException always
*/
private void readObject(ObjectInputStream s) throws InvalidObjectException {
throw new InvalidObjectException("Deserialization via serialization delegate");
}
Run Code Online (Sandbox Code Playgroud)
描述让我很好奇.什么是"恶意流"?这种方法如何防御呢?
在Java 8及更高版本的java.time框架中,Duration该类说:
此类以秒和纳秒为单位模拟时间量或时间量.可以使用其他基于持续时间的单位访问它,例如分钟和小时.此外,该
DAYS装置可以使用,并且被视为完全等于24小时,因此忽略了夏令时效果.
然而,当我调用get方法并传递时ChronoUnit.DAYS,抛出异常.
LocalTime start = LocalTime.of ( 0 , 0 , 0 ); // First moment of the day.
LocalTime stop = LocalTime.of ( 2 , 0 , 0 ); // 2 AM.
Duration duration = Duration.between ( start , stop );
long days = duration.get ( ChronoUnit.DAYS );
Run Code Online (Sandbox Code Playgroud)
线程"main"中的异常java.time.temporal.UnsupportedTemporalTypeException:不支持的单位:天
我误解了某些东西,还是滥用了这些课程?
使用带有Jackson JSON解析后端的Spring RestControllers,前端使用AngularJS.我正在寻找一种有效的方法让Jackson序列化一个Instant作为纪元毫秒,以便随后使用JavaScript代码.(在浏览器方面,我希望通过Angular的日期过滤器提供epoch ms :{{myInstantVal | date:'short' }}为我所需的日期格式.)
在Java方面,杰克逊将使用的吸气剂就是:
public Instant getMyInstantVal() { return myInstantVal; }
Run Code Online (Sandbox Code Playgroud)
序列化不会按原样运行,因为对于Instant ,jackson-datatype-jsr310默认不返回Epoch毫秒.我看着将@JsonFormat添加到上面的getter中以将Instant变形为前端可以使用的东西,但它遇到两个问题:(1)我可以提供它的模式显然仅限于SimpleDateFormat,它不提供"epoch milliseconds"选项,以及(2)当我尝试将Instant作为格式化日期发送到浏览器时,Jackson会抛出异常,因为@JsonFormat注释需要Instants的TimeZone属性,我不想硬编码因为它会因用户而异.
到目前为止我的解决方案(并且工作正常)是使用@JsonGetter创建替换的getter ,这会导致Jackson使用此方法来序列化myInstantVal:
@JsonGetter("myInstantVal")
public long getMyInstantValEpoch() {
return myInstantVal.toEpochMilli();
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?或者是否有一个很好的注释,我错过了我可以放在getMyInstantVal()所以我不必创建这些额外的方法?
我不住在使用夏令时的国家.
LocalDateTime,从UTC和ZoneIdDB中保留了偏移量LocalDateTime区域如果我申请ZoneId和偏移以获得该LocalDateTime区域,java.timeAPI 如何正确得到这个?它如何知道政府改变规则?它是否从互联网上获取更新?
我正在尝试编写一个泛型方法来返回ZonedDateTime给定的日期String及其格式.
如果未在日期中指定,我们如何ZonedDateTime使用默认值?ZoneIdString
它可以用java.util.Calendar,但我想使用Java 8时间API.
这里的问题是使用固定的时区.我将格式指定为参数.日期及其格式都是String参数.更通用.
代码和输出如下:
public class DateUtil {
/** Convert a given String to ZonedDateTime. Use default Zone in string does not have zone. */
public ZonedDateTime parseToZonedDateTime(String date, String dateFormat) {
//use java.time from java 8
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat);
ZonedDateTime zonedDateTime = ZonedDateTime.parse(date, formatter);
return zonedDateTime;
}
public static void main(String args[]) {
DateUtil dateUtil = new DateUtil();
System.out.println(dateUtil.parseToZonedDateTime("2017-09-14 15:00:00+0530", "yyyy-MM-dd HH:mm:ssZ"));
System.out.println(dateUtil.parseToZonedDateTime("2017-09-14 …Run Code Online (Sandbox Code Playgroud) 我有两个LocalDate声明如下:
val startDate = LocalDate.of(2019, 10, 31) // 2019-10-31
val endDate = LocalDate.of(2019, 9, 30) // 2019-09-30
Run Code Online (Sandbox Code Playgroud)
然后我使用Period.between函数计算它们之间的周期:
val period = Period.between(startDate, endDate) // P-1M-1D
Run Code Online (Sandbox Code Playgroud)
此处的期间为负数的月份和天数,如果endDate早于,则可以预期startDate。
但是,当我将其添加period回时startDate,得到的结果不是endDate,而是前一天的日期:
val endDate1 = startDate.plus(period) // 2019-09-29
Run Code Online (Sandbox Code Playgroud)
所以问题是,为什么不不变
startDate.plus(Period.between(startDate, endDate)) == endDate
保留这两个日期?
是Period.between谁返回了不正确的期限,还是LocalDate.plus谁添加了不正确的期限?