SimpleDateFormat始终以错误的时区返回1970.01.17
我一直在使用Processing 3.0,当我的Arduino输出某些值时,我正在尝试打印一个简单的时间戳,但它无法正常工作。 我尝试使用SimpleDateFormat,但它总是返回1970.01.17 17:48:35 GMT
,而不是实际时间。 以下是MVCE:
void setup () { SimpleDateFormat format = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss z"); format.setTimeZone (TimeZone.getDefault()); long timestamp = getTimeNow(); println(format.format(new Date(timestamp))); println(timestamp); } long getTimeNow () { Date d = new Date (); Calendar cal = new GregorianCalendar(); long current = d.getTime()/1000; long timezone = cal.get(Calendar.ZONE_OFFSET)/1000; long daylight = cal.get(Calendar.DST_OFFSET)/1000; return current + timezone + daylight; }
输出示例:
1970.01.17 17:48:35 GMT 1442915733
我怀疑问题是getTimeNow()
,因为,如果我将值插入在线纪元转换器,我得到正确的时间。 上面的代码有什么问题?
Date
对象参数接受时间长度,以毫秒为单位,而不是秒。 你需要将它乘以1000.并确保你提供它。
Date dateObj = new Date(1442915733L * 1000); System.out.println(dateObj);
决定将此作为答案发布,因为它与Mitesh的解决方案不同。
我删除了getTimeNow()
函数,而只是创建了一个新日期并使用了:
void setup () { SimpleDateFormat format = new SimpleDateFormat ("yyyy.MM.dd HH:mm:ss z"); format.setTimeZone (TimeZone.getDefault()); Date timestamp = new Date (); println(format.format(timestamp)); }
原因有两个。 在应用Matesh的答案之后,我在代码中遇到了另一个问题,TimeZone将忽略DST设置,因此时间戳中的小时是错误的。 此外,该解决方案消除了对几行代码的需求,这总是有帮助的。