Я пытаюсь преобразовать строку «2018-10-17T22: 00: 00Z» в восточный часовой пояс при добавлении ее в качестве события в календарь, но вместо того, чтобы добавлять время события как 18:00, он добавляет его как 22:00. Любая помощь будет оценена по достоинству.
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();
1 ответ
Это потому, что вы говорите синтаксическому анализатору игнорировать Z
или, скорее, соответствовать ему буквально, но не обрабатывать его значение .
Входные строки представляют собой значения Instant
, поэтому выполните синтаксический анализ до Instant
, затем примените часовой пояс.
Если у вас нет Android-устройства, совместимого с Java 8+, используйте 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()
- необходимое вам время в миллисекундах.
Для уровня API <24 шаблон формата 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
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].