我通过提供时区来创建日历实例,然后将日、月和年设置为日历。但是当我试图在毫秒内得到时间时,它总是以毫秒为单位返回dateTime,-1天。
下面是我设置日历的方式。
DatePickerDialog datePickerDialog = new DatePickerDialog(Objects.requireNonNull(getContext()), R.style.DialogTheme, (view, year, month, dayOfMonth) -> {
Calendar calendar = new DateUtils().getCountryCalendar();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, (month));
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long selectedDate = calendar.getTime().getTime();
}, mYear, mMonth, mDay);
我正在设置selectedDate作为1624986000000,这是Tue Jun29 2021 22:30
下面是getCountryCalendar()方法。
如果我选择6月30日,那么它应该在毫秒内返回6月30日。我不知道为什么会这样。如有任何建议,将不胜感激。
public Calendar getCountryCalendar() {
return Calendar.getInstance(TimeZone.getTimeZone("Asia/Bangkok"));
}
发布于 2021-06-21 16:36:17
tl;dr
LocalDate
.of( y , m , d )
.atStartOfDay( ZoneId.of( "Asia/Bangkok" ) )
.toInstant()
.toEpochMilli()
java.time
现代解决方案使用多年前取代遗留日期时间类(如java.time )的Calendar
类。
建立您的日期-纯价值。
LocalDate ld = LocalDate.of( y , m , d ) ;
很明显,你想要一天中的第一个时刻,就像在一个特定的时区中看到的那样。不要硬编码时间为00:00:00.0.某些时区中的某些日期可能不存在这一时间。让java.time决定一天中的第一个时刻。
ZoneId z = ZoneId.of( "Asia/Bangkok" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
显然,您希望将其转换为从1970年第一时刻的划时代参考点开始的毫秒数,如在UTC中所看到的。Instant
类表示在UTC中看到的某个时刻。
long millis = zdt.toInstant().toEpochMilli() ;
发布于 2021-06-21 14:32:47
时间戳1624986000000
确实是Jun 30, 00:00:00
by Asia/Bangkok
时区。您甚至可以检查它,这里。
另一方面,Colcata和科伦坡时区将此时间戳呈现为Jun 29 2021 22:30:00
。
由于您没有共享将时间戳转换为22:30的代码,所以我的假设是,在这段代码中,您使用的不是正确的时区(而是Asia/Colcata
或Asia/Colombo
,或者其他与GMT +05:30
匹配的东西)。
https://stackoverflow.com/questions/68069066
复制相似问题