РЕДАКТИРОВАТЬ: я пропустил «игнорирование времени суток». Сейчас он присутствует, но ближе к концу ...
Самый простой подход - это, вероятно, использовать SimpleDateFormat
, установив часовой пояс. соответственно:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = format.parse(text);
long millis = date.getTime();
(Здесь важна установка часового пояса, иначе значение будет интерпретироваться как местный часовой пояс.)
В качестве альтернативы, если вы делаете что-то менее тривиальное, чем это, используйте Joda Time, который является гораздо лучшим API даты / времени. В частности, SimpleDateFormat
не потокобезопасен, тогда как DateTimeFormatter
:
// This can be reused freely across threads after construction.
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.withLocale(Locale.US)
.withZoneUTC();
// Option 1
DateTime datetime = formatter.parseDateTime(text);
long millis = dateTime.getMillis();
// Option 2, more direct, but harder to diagnose errors
long millis = formatter.parseMillis(text);
Итак, мы разобрали всю кабуду целиком. Самый простой способ игнорировать часть даты - просто округлить ее - в конце концов, Java не учитывает дополнительных секунд, поэтому мы можем просто обрезать ее:
long millisPerDay = 24L * 60L * 60L * 1000L; // Or use TimeUnit
long dayMillis = (millis / millisPerDay) * millisPerDay;
Это будет «округляться к 1970 году», поэтому, если у вас есть дата до 1970 года, она будет округлена до конца дня - но я подозреваю, что это вряд ли будет проблемой.
В версии Joda Time вы можете просто использовать это вместо:
DateTime dateTime = formatter.parseDateTime(text);
long millis = dateTime.toLocalDate().getLocalMillis();
Я лично не согласился бы с идеей просто взять подстроку. Даже если вы на самом деле не заинтересованы в сохранении часа / минуты / секунды, я думаю, что уместно проанализировать то, что вам дали, и затем выбросить информацию. Помимо всего прочего, это приводит к тому, что ваш код не работает должным образом с неверными данными, например.
"2012-06-100"
or
"2012-06-14 25:01:25"
указывают на проблемы в том, что предоставляет вам данные, и это хорошо заметить, а не продолжать вслепую только потому, что первые 10 символов в порядке.
person
Jon Skeet
schedule
22.08.2012