我一直在使用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 的答案后,我的代码遇到了另一个问题,其中时区会忽略 DST 设置,因此时间戳中的小时是错误的。此外,这个解决方案消除了对几行代码的需要,这总是有帮助的。
java.time
2014 年 3 月,Java 8 引入了现代的
java.time
日期时间 API,取代了容易出错的旧版java.util
日期时间 API。任何新代码都应使用 java.time
API*。
Instant#ofEpochSecond
从纪元秒中获取 Instant
。
演示:
import java.time.*;
public class Main {
public static void main(String[] args) {
Instant instant = Instant.ofEpochSecond(1442915733L);
System.out.println(instant);
}
}
输出:
2015-09-22T09:55:33Z
注意: 如果由于某种原因,您需要
java.util.Date
的实例,请使用 instant
将上述代码中的 java.util.Date
转换为 Date date = Date.from(instant)
实例。
从 Trail:日期时间了解有关现代日期时间 API 的更多信息。
* 如果您收到
java.util.Date
的实例,请使用 java.time.Instant
将其转换为
Date#toInstant
,并根据您的要求从中派生 java.time
的其他日期时间类。