繁体   English   中英

在Java中从parse.com转换时间戳

[英]Converting timestamp from parse.com in java

我从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年前,这是非常错误的。 我做错了什么?

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

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

要解决这个问题。

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

扩展@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,则可能需要将此方法放入实用程序类中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM