У меня есть TimePickerDialog, вызываемый из onDateSetListener DatePickerDialog, чтобы позволить пользователю выбирать дату и время друг за другом. Я храню информацию в объекте Calendar calendar
. Когда пользователь будет готов, они нажмут, чтобы сохранить эту и другую информацию в базе данных. Соответствующая часть, которая экономит время здесьДата/время за 6 часов позади Android
call.setContactTimestamp(new DateTime(calendar.getTimeInMillis()));
Где setContactTimestamp()
сохраняет объект org.joda.time.DateTime к столу. Все это кажется прекрасным. Затем я показываю этот (и другие) данные обратно пользователю позже, используя этот соответствующий код TextView dateTime = (TextView) tableRow.findViewById(R.id.date_time); dateTime.setText(sdf.format(calls.get(i).getContactTimestamp().getMillis()));
Где SDF является SimpleDateFormat, который выглядит следующим образом SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm a", Locale.US);
выпуска: Время отображается всегда ровно 6 часов по местному времени и времени, которое отображается на устройстве. Я следил за точками останова, и что действительно меня смутило, прежде чем данные будут сохранены, я оцениваю sdf.format(calendar.getTimeInMillis())
и показывает точное время. Когда я верну информацию, миллисекунды выключены.
Пример: Я открыл дату/времяPickerDialogs, и у него была текущая дата и время, 5 января 2017 года в 8:47:36. Я щелкнул, чтобы сохранить это, и оценил в приведенном выше инструкции сохранения. new DateTime(calendar.getTimeInMillis())
оценивается по 2017-01-05T08:47:36.322-06:00
, что составило 1483627656322
millis. Затем я вытащил информацию для отображения, а возвращаемое значение joda.time.DateTime оценивалось до 2017-01-05T08:47:36.000Z
, которое было 1483606056000
миллисов, ровно на 6 часов после того, что я спас в 2:47:36.
Вот мой DatePickerDialog и TimePickerDialog в случае, если это уместно. Если я оставил все, что вы думаете, важно, пожалуйста, дайте мне знать, я добавлю.
DatePickerDialog dpd = new DatePickerDialog();
dpd.setOnDateSetListener(new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePickerDialog dialog, int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
TimePickerDialog tpd = new TimePickerDialog();
tpd.setOnTimeSetListener(new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute) {
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
callDateTime.setText(sdf.format(calendar.getTime()));
}
});
tpd.show(getActivity().getFragmentManager(), "tdp");
}
});
dpd.show(getActivity().getFragmentManager(), "dpd");
Вы можете заменить SimpleDateFormat sdf = new SimpleDateFormat ("MM/dd/yyyy h: mm a", Locale.US) с SimpleDateFormat sdf = new SimpleDateFormat ("MM/dd/yyyy h: mm a", Locale.getDefault()); и попробуйте один раз? – Raghavendra
Не повезло, но я ошибся. Расхождение должно быть в этой строке 'call.setContactTimestamp (новая DateTime (calendar.getTimeInMillis()));'. Например, я сохраняю 1483639217000 миллисов, но потом получаю 1483617617000 миллисов. Я до сих пор не понимаю, почему он спасает, а затем тянет разные миллионы? Создает ли объект DateTime из миллиса? – wizloc
Итак, вы конвертируете время java в jodatime, и, получив jodatime, попробуйте преобразовать это в java-время как: new DateTime (calls.get (i) .getContactTimestamp()). ToCalendar (Locale.getDefault()) и попробовать? – Raghavendra