0

我正在从 parse.com 获取对象的 createdAt 时间戳,即 2014-08-01T01:17:56.751Z。我有一门课可以将其转换为相对时间。

public static String timeAgo(String time){
  PrettyTime mPtime = new PrettyTime();

  long timeAgo = timeStringtoMilis(time);

  return mPtime.format( new Date( timeAgo ) );
}

public static long timeStringtoMilis(String time) {
  long milis = 0;

  try {
    SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date   = sd.parse(time);
    milis       = date.getTime();
  } catch (Exception e) {
    e.printStackTrace();
  }

  return milis;
}

问题是这会错误地解析日期。现在的结果是 4 年前的结果,这是非常错误的。我做错了什么?

4

2 回答 2

3

您当前的日期格式"yyyy-MM-dd HH:mm:ss"不适用于给定的示例2014-08-01T01:17:56.751Z。格式缺少字符TZ毫秒。将其更改为:

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

要解决这个问题。

还要检查 JavaDoc 中的示例SimpleDateFormat,因为它还显示了示例的正确日期格式:http: //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

于 2014-10-26T09:45:08.027 回答
3

扩展@Tom的答案:

问题

硬编码“Z”时,您假设所有日期都保存为 UTC - 不一定是这种情况。

问题是 SimpleDateFormat 不能将文字识别'Z'为 UTC '-0000' 偏移量的别名(无论出于何种原因,因为它声称符合 ISO-8601)。

所以你不能做

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");

因为这错误地假设所有日期都将始终以 UTC 编写,但你不能这样做

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

或者,因为这将无法解析出现文字“Z”的日期。

解决方案 1:使用 javax.xml.bind.DatatypeConverter

这个数据类型转换器实际上符合 ISO8601 的,并且可以像使用一样简单

import javax.xml.bind.DatatypeConverter;

public Long isoToMillis(String dateString){
  Calendar calendar = DatatypeConverter.parseDateTime(dateString);
  return calendar.getTime().getTime();
}

如果您仍然使用 JAXB,那将是可行的方法。

解决方案 2:使用条件格式

final static String ZULUFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
final static String OFFSETFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";

/* This is a utility method, so you want the calling method
 * to be informed that something is wrong with the input format
 */
public static Long isoToMillis(String dateString) throws ParseException{

  /* It is the default, so we should use it by default */
  String formatString = ZULUFORMAT;

  if(! dateString.endsWith("Z") ) {
    formatString = OFFSETFORMAT;
  }
  
  SimpleDateFormat sd = new SimpleDateFormat(formatString);
  return sd.parse(dateString).getTime();

}

如果您还没有使用 JAXB,您可能希望将此方法放入实用程序类中。

于 2014-10-26T10:37:21.150 回答