Java 日历字段中的结果不同/不正确
我试图添加事件,但它显示了一个不同的日期,我试图把我得到的Java 日历字段中的结果不同/不正确,java,android,date,calendar,java.util.calendar,Java,Android,Date,Calendar,Java.util.calendar,我试图添加事件,但它显示了一个不同的日期,我试图把我得到的 eventButton.setOnClickListener( new Button.OnClickListener() { @Override public void onClick(View v) { Calendar calendarEvent = Calendar.getInstance(); Inte
eventButton.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Calendar calendarEvent = Calendar.getInstance();
Intent calendarIntent = new Intent(Intent.ACTION_EDIT);
calendarIntent.setType("vnd.android.cursor.item/event");
Calendar time = Calendar.getInstance();
time.clear();
time.set(2018, 05, 23);
calendarIntent.putExtra(CalendarContract.Events.TITLE, "Whatever");
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME,time.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME,time.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_ALL_DAY,true);
calendarIntent.putExtra(CalendarContract.Events.RRULE, "FREQ=YEARLY");
startActivity(calendarIntent);
}
}
);
我得到的是6月22日,而不是5月23日:
Java
Calendar.set()
方法计算月份,就像编程中的数组一样,从0开始计算月份。因此,5月份的月份应该是4
,因为1月份是0,2月份是1,3月份是2,依此类推。我认为这就是造成你的问题的原因
您还可以使用月份枚举。也就是说,不要使用你的线路
time.set(2018, 05, 23);
使用
我希望这有帮助
long eventTimeInMillis = LocalDate.of(2018, Month.MAY, 23)
.atStartOfDay(ZoneOffset.UTC)
.toInstant()
.toEpochMilli();
正如Jamie Corkhill在中所说,您需要一天开始时的时间(00:00),以UTC为单位。上面的代码不仅给出了UTC 00:00的时间,而且还非常清楚地告诉您这就是它给出的时间
我使用的是java.time
,现代java日期和时间API。我发现它比过时的Calendar
类好得多
问题:我可以在Android上使用java.time吗?
是的,java.time
在较旧和较新的Android设备上运行良好。它至少需要Java6
- 在Java8和更高版本以及更新的Android设备上(我听说是API级别26),现代API是内置的
- 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
导入日期和时间类org.threeten.bp
- 解释如何使用
java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
Calendar.getInstance(TIMEZONE.getTimeZone(“UTC”));
@CoDesign我刚刚在我的模拟器上测试了你的代码,根据我的回答,你的月份只减少了一次,我得到了你想要的5月23日。你的设备在哪个时区?如果你能记录calendarEvent.getTimeZone().toString()会很有帮助
并演示给我看。请不要将05用于5。它可以工作,但这是一个坏习惯,因为一旦您尝试将08用于8.FYI,就会出现编译错误。麻烦的旧日期时间类,如java.util.date
,java.util.Calendar
和java.text.SimpleDateFormat
,现在已经被这些类所取代。很多在项目中,java.time功能的一部分被重新移植到java 6和java 7。进一步适应了项目中早期的Android。请参阅。您是否能够修复您的问题?您需要更多帮助吗?
long eventTimeInMillis = LocalDate.of(2018, Month.MAY, 23)
.atStartOfDay(ZoneOffset.UTC)
.toInstant()
.toEpochMilli();