安卓日历.getTime().getTime)总是返回-1天



我通过提供时区创建日历实例,然后将日期、月份和年份设置为日历。但是,当我试图以毫秒为单位获取时间时,它总是以毫秒-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/ColcataAsia/Colombo或其他与GMT +05:30匹配的时区(

相关内容

  • 没有找到相关文章

最新更新