SimpleDateFormat 总是 returns 1970.01.17 时区错误

SimpleDateFormat always returns 1970.01.17 with wrong timezone

我一直在使用 Processing 3.0,我试图在我的 Arduino 输出特定值时打印一个简单的时间戳,但它不起作用。我尝试使用 SimpleDateFormat,但它总是 returns 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);

决定post这个作为答案,因为它与 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 设置,因此时间戳中的小时是错误的。此外,此解决方案不再需要多行代码,这总是很有帮助的。