当前位置: 首页 > 面试题库 >

将事件添加到日历时,Android Studio将ISO字符串转换为“ America / New_York”

石臻
2023-03-14
问题内容

我将字符串“
2018-10-17T22:00:00Z”作为事件添加到日历时尝试将其转换为东部时区,但不是将事件时间添加为6pm,而是将其添加为10pm。任何帮助,将不胜感激。

String[] segments = uri.getPath().split("/");
Date startDate = null;
Date endDate = null;
Activity activity = (Activity) context;
String stTime = "2018-10-17T22:00:00Z";
String enTime = "2018-10-17T23:00:00Z";
String eventTitle = segments[3];
String eventLocation = segments[4];

TimeZone timezone = TimeZone.getTimeZone("America/New_York");

SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
formatStart.setTimeZone(timezone);

SimpleDateFormat formatEnd = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
formatEnd.setTimeZone(timezone);

try {
    startDate = formatStart.parse(stTime);
    endDate = formatEnd.parse(enTime);
} catch (ParseException e) {
    e.printStackTrace();
}

Calendar calStart = new GregorianCalendar(timezone);
calStart.setTime(startDate);

Calendar calEnd = new GregorianCalendar(timezone);
calEnd.setTime(endDate);


if (ActivityCompat.checkSelfPermission(this.context, android.Manifest.permission.WRITE_CALENDAR) != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(activity, new String[]{android.Manifest.permission.WRITE_CALENDAR},1);
}

Calendar beginTime = Calendar.getInstance();
beginTime.set(calStart.get(Calendar.YEAR), calStart.get(Calendar.MONTH), calStart.get(Calendar.DAY_OF_MONTH), calStart.get(Calendar.HOUR_OF_DAY), calStart.get(Calendar.MINUTE));

Calendar endTime = Calendar.getInstance();
endTime.set(calEnd.get(Calendar.YEAR), calEnd.get(Calendar.MONTH), calEnd.get(Calendar.DAY_OF_MONTH), calEnd.get(Calendar.HOUR_OF_DAY), calEnd.get(Calendar.MINUTE));

ContentResolver cr = context.getContentResolver();
ContentValues values = new ContentValues();
values.put(CalendarContract.Events.DTSTART, beginTime.getTimeInMillis());
values.put(CalendarContract.Events.DTEND, endTime.getTimeInMillis());
values.put(CalendarContract.Events.TITLE, eventTitle);
values.put(CalendarContract.Events.CALENDAR_ID, 1);
values.put(CalendarContract.Events.EVENT_TIMEZONE, "America/New_York");
values.put(CalendarContract.Events.EVENT_LOCATION, eventLocation);

cr.insert(CalendarContract.Events.CONTENT_URI, values);
Toast.makeText(context, "Successfully Added Event", Toast.LENGTH_SHORT).show();

问题答案:

那是因为您要告诉解析器忽略Z,或者说是按字面值匹配,而不是处理它的 意思

输入字符串是Instant值,因此解析为Instant然后 应用时区。
如果您没有兼容Java
8+的Android,请使用ThreeTenABP。

String stTime = "2018-10-17T22:00:00Z";

ZonedDateTime time = Instant.parse(stTime).atZone(ZoneId.of("America/New_York"));
System.out.println(time); // prints: 2018-10-17T18:00-04:00[America/New_York]

如果您更喜欢使用过时的SimpleDateFormat,只需使用正确的格式,而不指定时区。

SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
Date startDate = formatStart.parse(stTime);
// My default time zone is America/New_York, so:
System.out.println(startDate); // prints: Wed Oct 17 18:00:00 EDT 2018

startDate.getTime() 是您需要的时间。

对于<24级的API,格式模式X不起作用,因此您需要Z像问题中那样进行硬编码,但是要告诉解析器它采用UTC,因为这就是Z时区的含义。

SimpleDateFormat formatStart = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
formatStart.setTimeZone(TimeZone.getTimeZone("UTC"));
Date startDate = formatStart.parse(stTime);
// My default time zone is America/New_York, so:
System.out.println(startDate); // prints: Wed Oct 17 18:00:00 EDT 2018


 类似资料:
  • 我们正在使用API Google开发应用程序。在这个过程中,我们遇到了一些困难。 我们使用了php-sdk,在这个页面上“code . Google . com/p/Google-API-PHP-client/”我们使用了谷歌日历服务。我们遵循位于以下位置的文档:“developers . Google . com/Google-apps/calendar/v3/reference/”日历和事件部

  • 我有一个字符串格式化的日期我怎么能得到这个的Epoch值?

  • 问题内容: 我正在尝试以 2015-08-20T08:26:21.000Z* 到 2015-08-20T08:26:21Z 的格式创建字符串 * 我知道可以使用某些String拆分技术来做到这一点,但是我想知道是否有一种优雅的解决方案(只需最少的代码更改)。 以上都是时间字符串,我需要的最后一个是ISO 8601中的Date。http://tools.ietf.org/html/rfc3339#s

  • 我需要将一些字符串日期转换为另一种格式的字符串日期 我想按照“yyyy-MM-dd'T'HH:MM:ss.SSSXX”模式获得ISO-8601格式的结果日期字符串 你能帮我实现这个吗?

  • 我有Excel数据,并尝试使用Talend Big data for Open Studio将数据插入MongoDB。这是我的工作, 在excel表单中,我有一个日期值列,格式为7/13/2017(MM/DD/YYYY)作为字符串类型,我正在尝试将该列值作为ISO格式ISODate(“2017-07-13T00:00:00.000Z”)插入MongoDB中。

  • 问题内容: 我正在尝试将ISO 8601格式的String转换为。 Z如果与语言环境一起使用(比较示例),我发现该模式符合ISO8601。 但是,使用无法转换正确格式的String 2010-01-01T12:00:00+01:00。我必须先将其转换为2010-01-01T12:00:00+0100,而不能使用冒号。 所以,目前的解决方案是 显然不是那么好。我是否缺少某些东西或有更好的解决方案?