【问题标题】:SimpleDateFormat always returns 1970.01.17 with wrong timezoneSimpleDateFormat 总是返回 1970.01.17 时区错误
【发布时间】:2015-12-19 04:29:16
【问题描述】:

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

【问题讨论】:

  • 您能否将我们指向format(long) 的文档? AFAIK 这不存在
  • 没错,它不存在。应该更彻底地检查参考。尽管如此,如果我尝试使用 Date 构造函数将其转换为日期,它仍然会给我错误的问题。编辑帖子以反映更改。

标签: java date processing simpledateformat epoch


【解决方案1】:

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

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

【讨论】:

  • 好吧,它几乎可以工作,有正确的时区和所有...但是它有错误的 DST 偏移量,所以它提前一小时显示时间。
  • /1000 还在吗?他们应该被简单地删除。否则长整数除法会截断。虽然那应该没问题。
  • 放 1000L 而不是 1000。更多信息在这里:stackoverflow.com/a/5041249/2612536
  • 你是我的英雄!谢谢
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2021-08-16
    • 2013-04-13
    • 2020-07-09
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    相关资源
    最近更新 更多