在静态上下文中将不推荐的Java日期替换为Calendar.set ou Gregoriacalendar.set
我正在使用Java开发Android项目,Android Studio IDE警告我Dateint,int,int在API16中已被弃用,但当我将其替换为Calendar.set时,生成失败,因为无法在静态上下文中引用非静态方法 正在对静态的日期选择器OnSelectedListener调用此方法在静态上下文中将不推荐的Java日期替换为Calendar.set ou Gregoriacalendar.set,java,android,date,calendar,Java,Android,Date,Calendar,我正在使用Java开发Android项目,Android Studio IDE警告我Dateint,int,int在API16中已被弃用,但当我将其替换为Calendar.set时,生成失败,因为无法在静态上下文中引用非静态方法 正在对静态的日期选择器OnSelectedListener调用此方法 如果没有真正可以使用的替换品,它怎么会被弃用呢?我解决了替换品的问题 return new Date(year-1900, month, day) 借 java.time和ThreeTenABP 使
如果没有真正可以使用的替换品,它怎么会被弃用呢?我解决了替换品的问题
return new Date(year-1900, month, day)
借
java.time和ThreeTenABP
使用java.time中的LocalDate,这是现代java日期和时间API。和他一起工作要好得多
int year = 2019;
int month = 10;
int day = 15;
LocalDate date = LocalDate.of(year, month, day);
System.out.println(date);
此代码段的输出为:
2019-10-15
LocalDate的年数和月数与人类的相同,因此不需要减去有趣的值进行调整。如果您需要尚未升级到java.time的API的日期,则转换如下:
Instant startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
Date oldfashionedDate = DateTimeUtils.toDate(startOfDay);
System.out.println(oldfashionedDate);
2019年10月15日星期二00:00:00 CEST
日期、日历和公历都设计得很糟糕,而且都早已过时。所以不要考虑使用它们。
问:java.time不需要Android API级别26吗?
time在较旧和较新的Android设备上都能很好地工作。它至少需要Java6
在Java8和更高版本以及API级别为26的较新Android设备上,内置了现代API。仅在这种情况下,如果要从即时转换为日期,请使用Date.fromstartOfDay。
在非Android Java 6和7中,获得了Three Ten Backport,即JSR 310的现代类Three Ten的Backport;请参阅底部的链接。
在较旧的Android上,使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保使用子包从org.threeten.bp导入日期和时间类。
链接
解释如何使用java.time。
,其中首次描述了java.time。
,java.time的后端口到JSR-310的Java6和Java7。
,Android版Three Ten Backport
,解释得非常透彻。
请添加代码以进行进一步调查您无法从静态上下文调用非静态函数。请也添加IDE中的警告消息。最后一个包含LocalDate和LocalDateTime的日期操纵api附带了多个资源。使用java.time中的LocalDate(现代java日期和时间API)是一个很好的主意。另一方面,一个只包含一个链接的答案对堆栈溢出并没有多大帮助。请编辑您的答案,总结链接中的要点和/或解释它如何回答问题?那太好了。java.time是替换不推荐使用的日期api的替代品。为了解释所有这些是如何工作的,一个带有教程的链接是有意义的。不过,它并没有给出相同的结果。使用我的答案中的示例值,我从您的第一个片段中获得了2019年11月15日星期五00:00:00 CET,从另一个片段中获得了2019年10月15日星期二20:11:33 CEST。我得说,这种相似性对spot来说并不微不足道。这就是旧的日期和时间类的混乱程度。
Instant startOfDay = date.atStartOfDay(ZoneId.systemDefault()).toInstant();
Date oldfashionedDate = DateTimeUtils.toDate(startOfDay);
System.out.println(oldfashionedDate);