我试着计算两个日期之间的差异,我注意到了一件事.仅计算天数时,夏令时的开始时间包含在间隔中,因此结果将在1天内缩短.
要获得准确的结果,还必须考虑小时值.
例如:
SimpleDateFormat format = new SimpleDateFormat("MM-dd-yyyy");
Date dfrom = format.parse("03-29-2015");
Date dto = format.parse("03-30-2015");
long diff = dto.getTime() - dfrom.getTime();
System.out.println(diff);
System.out.println("Days: "+diff / (24 * 60 * 60 * 1000));
System.out.println("Hours: "+diff / (60 * 60 * 1000) % 24);
Run Code Online (Sandbox Code Playgroud)
输出:
82800000
Days: 0
Hours: 23
Run Code Online (Sandbox Code Playgroud)
有人有更好的解决方案吗?
我想将Java 8 LocalDateTime转换为最接近的5分钟.例如
1601 -> 1605
1602 -> 1605
1603 -> 1605
1604 -> 1605
1605 -> 1605
1606 -> 1610
1607 -> 1610
1608 -> 1610
1609 -> 1610
1610 -> 1610
Run Code Online (Sandbox Code Playgroud)
我想使用LocalDateTime或Math api的现有功能.有什么建议?
我正在尝试创建一个DateTimeformatter以验证以下日期时间:
String date1 = "2017-07-06T17:25:28";
String date2 = "2017-07-06T17:25:28.1";
String date3 = "2017-07-06T17:25:28.12";
String date4 = "2017-07-06T17:25:28.123";
String date5 = "2017-07-06T17:25:28.1234";
String date6 = "2017-07-06T17:25:28.12345";
String date7 = "2017-07-06T17:25:28.123456";
String date8 = "2017-07-06T17:25:28.";
Run Code Online (Sandbox Code Playgroud)
我已尝试使用以下日期时间格式器来验证上述日期:
public static final String DATE_TIME_FORMAT_PATTERN = "yyyy-MM-dd'T'HH:mm:ss";
DateTimeFormatter formatter1 = new DateTimeFormatterBuilder()
.appendPattern(DATE_TIME_FORMAT_PATTERN)
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)
.toFormatter();
Run Code Online (Sandbox Code Playgroud)
它工作正常,所有上述日期,但根据我的要求就应该失败java.time.format.DateTimeParseException的date8.
注意:我知道我可以使用以下格式化程序获得预期的结果:
DateTimeFormatter formatter2 = DateTimeFormatter
.ofPattern("yyyy-MM-dd'T'HH:mm:ss[.SSSSSS][.SSSSS][.SSSS][.SSS][.SS][.S]");
Run Code Online (Sandbox Code Playgroud)
但我想知道我们可以通过改变来实现预期的结果formatter1吗?
要解析我使用的日期:
LocalDateTime.parse(date1, formatter1);
Run Code Online (Sandbox Code Playgroud) 如果我用java.util.Date的toInstant()上这恰好是一个变量java.sql.Date,我得到一个UnsupportedOperationException。
try {
java.util.Date input = new java.sql.Date(System.currentTimeMillis());
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
} catch (UnsupportedOperationException e) {
// grrr!
}
Run Code Online (Sandbox Code Playgroud)
的java.util.Date,我很担心经由传统API的MySQL数据库来自一个日期字段,而实际上是一个java.sql.Date。
现在,以下相关问题都很有趣:
UnsupportedOperationException-为什么不能在java.sql.Date上调用toInstant()?
将java.util.Date转换为java.time.LocalDate
LocalDate到java.util.Date的转换,反之亦然?
但它们没有提供任何截断a的优雅方法java.util.Date来摆脱时间成分并获得Java 8 LocalDate。
我承认存在一个问题,一个时区中的同一时刻可能与另一时区中的同一时刻的日期不同。
我怀疑解决方案将涉及java.util.Calendar,但与其设计我自己的解决方案,不如先确定其他人已经做的事情。
我希望找到比这短的东西:
Run Code Online (Sandbox Code Playgroud)Date date = new Date(); // timestamp now Calendar cal = Calendar.getInstance(); // get calendar instance cal.setTime(date); // set cal to date cal.set(Calendar.HOUR_OF_DAY, 0); // set hour to midnight cal.set(Calendar.MINUTE, 0); …
默认情况下,ThreeTenABP.LocalDateTime将转换为
{"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano":115000000,"second":18}}
我可以写一个适配器来支持ISO日期字符串 2018-04-10T03:45:26.009
class LocalDateTimeAdapter {
@ToJson
fun toJson(value: LocalDateTime): String {
return FORMATTER.format(value)
}
@FromJson
fun fromJson(value: String): LocalDateTime {
return FORMATTER.parse(value, LocalDateTime.FROM)
}
companion object {
private val FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME
}
}
Run Code Online (Sandbox Code Playgroud)
如何编写可以支持这两种格式的适配器(fromJson)
{"date":{"day":10,"month":4,"year":2018},"time":{"hour":3,"minute":34,"nano":115000000,"second":18}}2018-04-10T03:45:26.009除了确定使用哪种格式之外fromJson,我很好奇Moshi如何在内部为LocalDateTime执行toJson/fromJson
基本上,我使用以下代码将字符串解析为 LocalDateTime,它在大多数情况下都可以正常工作。
DateTimeFormatter dtformatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
Run Code Online (Sandbox Code Playgroud)
但是,我遇到秒和毫秒的情况00000,这是解析器失败并打印 aLocalDateTime 2018-03-01T09:16而不是2018-03-01T09:16:00.000.
System.out.println(LocalDateTime.parse("20180301091600000",dtformatter));
Run Code Online (Sandbox Code Playgroud)
(请注意,在我的代码中,我必须将字符串解析为LocalDateTime,进行一些比较,然后在最后打印LocalDateTime到 csv)
如何修复它以使其打印2018-03-01T09:16:00.000而不是打印2018-03-01T09:16?
仅供参考,我正在使用 jdk10。
我正在尝试将LocalDate变量格式化为dd.MMM.YYYY:
DateTimeFormatter.ofPattern("dd.MMM.yyyy")
Run Code Online (Sandbox Code Playgroud)
问题是,超过一半的时间我得到两个点。例如01-01-2000转到01.Jan..2000.
我知道为什么我会遇到这个问题,因为这三个Ms。当我使用时dd.MM.yyyy,我没有01.01.2000问题。第三M是问题。
我怎样才能解决这个问题?
我在解析时遇到问题ZonedDateTime:
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-ddzhh:mm");
ZonedDateTime.parse(s, formatter);
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
java.time.format.DateTimeParseException:
Text '2022-05-24UTC12:15' could not be parsed at index 10
Run Code Online (Sandbox Code Playgroud)
这段代码有什么问题吗?
java datetime-parsing java-time zoneddatetime datetimeparseexception
我正在将一些签名从 迁移f(long dur, TimeUnit timeUnit)到f(Duration duration),并希望用后者来实现前者。
在 Java 8 上,我找不到任何 API 可以轻松地将long+转换TU为 a Duration,我唯一的想法就是做一些丑陋的事情,例如:
static Duration convert(long dur, TimeUnit timeUnit) {
switch (timeUnit) {
case DAYS:
return Duration.ofDays(dur);
case HOURS:
/* alternative, but (again) I don't have an easy conversion from TimeUnit -> ChronoUnit */
return Duration.of(dur, ChronoUnit.HOURS);
case ..... /* and so on */
}
}
Run Code Online (Sandbox Code Playgroud)
或者我错过了一些API?
我无法理解为 ZonedDateTimeClass 中的 plusDays() 方法提供的文档的特定部分。文件指出:
\n\n\n返回添加了指定天数的此 ZonedDateTime 的副本。
\n这在本地时间线上运行,将天数添加到本地日期时间。然后使用区域 ID 获取偏移量,将其转换回 ZonedDateTime。
\n当转换回 ZonedDateTime 时,如果本地日期时间处于重叠状态,则如果可能,将保留偏移量,否则将使用较早的偏移量。如果存在间隙,则本地日期时间将向前调整\n间隙的长度。
\n该实例是不可变的并且不受该方法调用的影响。
\n参数:days \xe2\x80\x93 要添加的天数,可以为负数
\n返回:基于此日期时间并添加了天数的 ZonedDateTime,\n不为 null
\n抛出: DateTimeException \xe2\x80\x93 如果结果超出支持的日期\n范围
\n
我的理解是:假设我们有 ZonedDateTime 对象代表September 4, 2022 6 PM in America/New_York TimeZone. 所以这个方法会先将其转换为LocalDateTime,即会丢失时区信息,只保留September 4, 2022 6 PM。它将向其添加一些天数,假设为 7,以便结果为September 11, 2022 6 PM,现在它将通过提供与时区相关的信息将其转换回 ZonedDateTime 对象。
但是,我无法理解文档的后半部分,即
\n\n\n当转换回 ZonedDateTime 时,如果本地日期时间处于重叠状态,则如果可能,将保留偏移量,否则将使用较早的偏移量。如果存在间隙,则本地日期时间将向前调整\n间隙的长度。
\n
他们的意思是什么local date-time is in an overlap …