Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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 日历字段中的结果不同/不正确_Java_Android_Date_Calendar_Java.util.calendar - Fatal编程技术网

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
  • ,解释得非常透彻

谢谢你的回答。你说得对,这解决了这个月的问题,但这一天又少了一天,那么,这一天还有其他方法吗,或者我只需将要添加的日期增加一天?@CoDesign我会很快回复你,我会亲自调查并测试它。@CoDesign来自文档,“如果allDay设置为1 eventTimezone必须是时区UTC,并且时间必须对应于午夜边界。”这意味着您应该使用
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();