SimpleDateFormat 始终返回 1970.01.17,时区错误

问题描述 投票:0回答:3

我一直在使用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()
,因为,如果我将这些值插入在线纪元转换器,我会得到正确的时间。上面的代码有什么问题?

java date processing simpledateformat epoch
3个回答
19
投票

Date
对象参数接受以毫秒为单位的时间,而不是秒。您需要将其乘以 1000。并确保提供足够长的时间。

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

1
投票

决定将此作为答案发布,因为它与 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 设置,因此时间戳中的小时是错误的。此外,这个解决方案消除了对几行代码的需要,这总是有帮助的。


0
投票

java.time

2014 年 3 月,Java 8 引入了现代的

java.time
日期时间 API,取代了容易出错的旧版
java.util
日期时间 API
。任何新代码都应使用
java.time
API*

使用现代日期时间 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
的其他日期时间类。

© www.soinside.com 2019 - 2024. All rights reserved.