2015-09-22 22 views
4

我一直在使用Processing 3.0,并且我试图打印一个简单的时间戳,当我的Arduino输出某些值时,但它不起作用。我试图使用SimpleDateFormat,但它总是返回1970.01.17 17:48:35 GMT,而不是实际的时间。下面是MVCE:SimpleDateFormat总是返回错误的时区1970.01.17

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(),因为,如果我插值到在线时代转换器我得到正确的时间。上述代码中的问题是什么?

+0

你能指点我们的格式(长)'文档吗? AFAIK这不存在 –

+0

确实,它不存在。应该更彻底地检查参考。不过,如果我尝试使用Date构造函数将其转换为日期,它仍然会给我一个错误的问题。编辑帖子以反映变化。 – MKII

回答

15

Date object参数接受的时间只有毫秒而不是秒。你需要乘以1000.并确保你提供它很长时间。

Date dateObj = new Date(1442915733 * 1000); 
System.out.println(dateObj); 
+0

好吧,它几乎可以工作,具有正确的时区和所有...但它具有错误的DST偏移量,所以它显示提前一个小时的时间。 – MKII

+0

'/ 1000'还在吗?他们应该简单地被删除。否则长整数除法截断。虽然这应该没问题。 –

+0

把1000L而不是1000.更多的信息在这里:http://stackoverflow.com/a/5041249/2612536 –

0

决定后这是一个答案,因为它是从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设置,因此时间戳中的小时数是错误的。此外,该解决方案消除了对多行代码的需求,这总是有帮助的。