Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在静态上下文中将不推荐的Java日期替换为Calendar.set ou Gregoriacalendar.set_Java_Android_Date_Calendar - Fatal编程技术网

在静态上下文中将不推荐的Java日期替换为Calendar.set ou Gregoriacalendar.set

在静态上下文中将不推荐的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 使

我正在使用Java开发Android项目,Android Studio IDE警告我Dateint,int,int在API16中已被弃用,但当我将其替换为Calendar.set时,生成失败,因为无法在静态上下文中引用非静态方法

正在对静态的日期选择器OnSelectedListener调用此方法


如果没有真正可以使用的替换品,它怎么会被弃用呢?

我解决了替换品的问题

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);