我通过提供时区创建日历实例,然后将日期、月份和年份设置为日历。但是,当我试图以毫秒为单位获取时间时,它总是以毫秒-1天为单位返回dateTime。
以下是我如何设置日历。
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);
我将其设置为返回我选定日期为1624986000000,即2021年6月29日星期二22:30:00
这里是getCountryCalendar((方法。
如果我选择6月30日,那么它应该在毫秒内返回6月30号。我不知道为什么会这样。欢迎提出任何建议。
public Calendar getCountryCalendar() {
return Calendar.getInstance(TimeZone.getTimeZone("Asia/Bangkok"));
}
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() ;
时间戳1624986000000
实际上是Jun 30, 00:00:00
乘以Asia/Bangkok
时区。你甚至可以在这里查看。
另一方面,Colcata和Colombo时区将此时间戳渲染为Jun 29 2021 22:30:00
。
由于您没有共享将时间戳转换为22:30:00的代码,我假设在该代码中您没有使用正确的时区(而是使用Asia/Colcata
、Asia/Colombo
或其他与GMT +05:30
匹配的时区(