Вот так вот надо манипулировать с датой...
Дело то нехитрое. Надо взять строку и конвертнуть в дату обрезать до дней (убрать часы, минуты, секунды...) и конвертнуть из TimeZone "GMT-8" в "GMT".
Вот пример реализации такой логики:
/**
* Convert formated string from request to Date
* @param startTimeStr formated string "yyyy-MM-dd z"
* @return Date
*/
public Date getStartTime(String startTimeStr) {
Date result = null;
// if period parameter init
if (startTimeStr == null) {
// get current time in GMT
final Calendar calStart = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
logger.info("Current start time: " + calStart.getTime());
calStart.set(Calendar.HOUR, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
// convert time from GMT to models TZ
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
startTimeStr = sdf.format(calStart.getTime());
startTimeStr += " " + model.getTimezone();
}
logger.info("Start time as string: " + startTimeStr);
startTimeStr = addStartTime(startTimeStr);
result = TimeUtil.parseDate(startTimeStr);
logger.info("Start time: " + result);
return result;
}
....
/**
* Add time to formated date string
* @param date "yyy/MM/dd z"
* @return
*/
public String addStartTime(final String date) {
return date.replace("GMT", "00:00:00 GMT");
}
.....
/**
* Translate formated string to date
* @param dateStr formated string
* @return date in GMT
*/
public static Date parseDate(String dateStr) {
Date result;
try {
String dateFormatStr;
if (Pattern.matches(".*\\d\\d:\\d\\d:\\d\\d.*", dateStr)) {
dateFormatStr = "yyyy-MM-dd HH:mm:ss";
} else {
if (Pattern.matches(".*\\d\\d:\\d\\d.*", dateStr)) {
dateFormatStr = "yyyy-MM-dd HH:mm";
} else {
dateFormatStr = "yyyy-MM-dd";
}
}
final DateFormat sdf = new SimpleDateFormat(dateFormatStr);
if (dateStr.indexOf("GMT") != -1) {
final String timeZoneStr = dateStr.substring(dateStr.trim()
.lastIndexOf(' '));
sdf.setTimeZone(TimeZone.getTimeZone(timeZoneStr.trim()));
dateStr = dateStr.replace(timeZoneStr, "");
} else {
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
}
result = sdf.parse(dateStr.trim());
} catch (final Exception e) {
return null;
}
return result;
}
Результат вполне не очевиден. Был даже юнит тест. Кроме того, по технологии копи+паст был сделан метод getEndTime().
Подписаться на:
Комментарии к сообщению (Atom)
2 комментария:
Что самое примечательное - есто комменты :)
И не один! :)
Отправить комментарий