本文介绍了查询" ALL_DAY"使用CalendarContract.Instances结果事件错误的时区的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用CalendarContract.Instances得到一组日历活动。总的来说我的查询工作的罚款。然而,开始时间和结束时间为事件中的节假日日历回来在一个错误的时区。在我个人日历中的一个事件都配备正确的时间。

例如:

 元旦开始04:00 PM,2014年12月31日。

在这里为

 歌剧开始02:00 PM,2015年1月11日。

我使用的是完全相同的code同时显示:

 的SimpleDateFormat格式化=新的SimpleDateFormat(HH:MM A,D MMM YYYY,Locale.US);
  logD(preFIX + I +:+ formatter.format(data.startTime)+;+ data.note);

在哪里data.startTime映射到Instances.BEGIN和data.note映射到Instances.TITLE。歌剧院是显示在正确的时间,元旦显然是8小时关闭(我在美国太平洋时区)。

如果我在Android日历应用程序查看这些,都显示正确的时间。

很显然,我可以看看的日历事件来源于并相应地设置时区,使其显示正确的时间。不过,我希望有一个我是不知道的更妥善的解决。

下面是从光标获取事件价值code的喀嚓:

  @覆盖
公共查看getView(INT位置,查看convertView,父母的ViewGroup)
{
  ...
  EventFields领域=新EventFields();
  cursor.moveToPosition(位置);
  fields.title = cursor.getString(cursor.getColumnIndex(Instances.TITLE));
  fields.dtStart = cursor.getLong(cursor.getColumnIndex(Instances.BEGIN));
  fields.dtEnd = cursor.getLong(cursor.getColumnIndex(Instances.END));
  fields.iCalDuration = cursor.getString(cursor.getColumnIndex(Instances.DURATION));
  fields.rrule = cursor.getString(cursor.getColumnIndex(Instances.RRULE));
  ...
}

下面的查询:

  @覆盖
公共无效refreshData(字符串约束)
{
  长开始= ...一些日期...
  长端= ...另一个日期...  最后乌里URI = Uri.parse(CalendarContract.Instances.CONTENT_URI +/+
                            Long.toString(开始)+/+
                            Long.toString(结束));  //设置查询 - 投影顺序必须符合以上静。
  最终的String [] =投影新的String [] {
    Instances._ID,
    Instances.EVENT_ID,
    Instances.TITLE,
    Instances.BEGIN,
    Instances.END,
    Instances.DURATION,
    Instances.RRULE,
    Instances.DESCRIPTION,
  };
  最后弦乐中将sortOrder = Instances.BEGIN;  串选择= NULL;
  如果(约束!= NULL)
    选择= Instances.TITLE +LIKE'%+ constraint.toString()+%';  光标= getActivity()。getContentResolver()查询(
    URI,
    投影,
    选择,
    空值,
    排序);
}

对于上面的例子中,元旦

 元旦DTSTART = 14199.84亿和

和它真正开始于下午4点的另一个事件有

 罗杰DTSTART = 1420052400000


解决方案

由于在评论中讨论,我们确定这是关系到UTC时间显示全日事件的一个问题。

看起来这是just Android的如何处理它的。

在Android文档纵观格式时间类

And finally on the CalendarContract.Events docs

So what you have done by formatting all day events is correct

simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Update

By default, if you don't explicitly set the timezone of your SimpleDateFormat, it will default to your device's local timezone.

Your BEGIN and END times should come back in UTC time.

All Day Events are always set to midnight in the UTC timezone, so formatting them in anything but the UTC time zone will give you a non-midnight time.

You can check the Calendar Event Instance's timezone using the inherited field:

这篇关于查询" ALL_DAY"使用CalendarContract.Instances结果事件错误的时区的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 21:22