首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android Calendar.getTime().getTime()总是返回-1天

Android Calendar.getTime().getTime()总是返回-1天
EN

Stack Overflow用户
提问于 2021-06-21 13:45:12
回答 2查看 191关注 0票数 0

我通过提供时区来创建日历实例,然后将日、月和年设置为日历。但是当我试图在毫秒内得到时间时,它总是以毫秒为单位返回dateTime,-1天

下面是我设置日历的方式。

代码语言:javascript
运行
复制
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日。我不知道为什么会这样。如有任何建议,将不胜感激。

代码语言:javascript
运行
复制
public Calendar getCountryCalendar() {

    return Calendar.getInstance(TimeZone.getTimeZone("Asia/Bangkok"));
}
EN

回答 2

Stack Overflow用户

发布于 2021-06-21 16:36:17

tl;dr

代码语言:javascript
运行
复制
LocalDate
.of( y , m , d )
.atStartOfDay( ZoneId.of( "Asia/Bangkok" ) )
.toInstant()
.toEpochMilli() 

java.time

现代解决方案使用多年前取代遗留日期时间类(如java.time )的Calendar类。

建立您的日期-纯价值。

代码语言:javascript
运行
复制
LocalDate ld = LocalDate.of( y , m , d ) ;

很明显,你想要一天中的第一个时刻,就像在一个特定的时区中看到的那样。不要硬编码时间为00:00:00.0.某些时区中的某些日期可能不存在这一时间。让java.time决定一天中的第一个时刻。

代码语言:javascript
运行
复制
ZoneId z = ZoneId.of( "Asia/Bangkok" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

显然,您希望将其转换为从1970年第一时刻的划时代参考点开始的毫秒数,如在UTC中所看到的。Instant类表示在UTC中看到的某个时刻。

代码语言:javascript
运行
复制
long millis = zdt.toInstant().toEpochMilli() ;
票数 2
EN

Stack Overflow用户

发布于 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/ColcataAsia/Colombo,或者其他与GMT +05:30匹配的东西)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68069066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档