gpt4 book ai didi

java - 在 GMT 中获取 UNIX 时间戳的快速 Java 6 实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:50 28 4
gpt4 key购买 nike

我正在寻找一种与 Java 6 兼容的方法,从 java.sql.Date 对象中生成 GMT 纪元以来的秒数/UTC(又名 UNIX 时间戳) .

我的 Java 8 代码是:

Long seconds = dateObject.toLocalDate().atStartOfDay(ZoneId.of("GMT")).toEpochSecond()

我的 Java 6 代码是:

final Calendar cal = Calendar.getInstance();
cal.setTime(dateObject);
final int year = cal.get(Calendar.YEAR);
final int month = cal.get(Calendar.MONTH);
final int day = cal.get(Calendar.DAY_OF_MONTH);

final GregorianCalendar c = new GregorianCalendar();
c.clear();
c.setGregorianChange(new Date(Long.MIN_VALUE));
c.setTimeZone(TimeZone.getTimeZone("GMT"));
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);

Long seconds = c.getTimeInMillis() / 1000

不幸的是,Java 6 代码的速度大约是 Java 8 代码的一半。我过去有一个 Java 6 解决方案,代码更少(因此速度更快),但是当出现异常日期时,它是错误的,如“0001-01-01”,其中需要 setGregorianChange() 并且第二个 GergorianCalendar 进来了。

知道我可以做些什么来获得快速的 Java 6 实现吗?

  1. 我需要线程安全
  2. “2010-01-01”的结果必须是 1262304000
  3. “0001-01-01”的结果必须是 -62135596800
  4. “2999-12-31”的结果必须是 32503593600

编辑 1

我还尝试了以下 Java 6 代码:

final TimeZone tz = TimeZone.getDefault();
Long seconds = (dateObject.getTime() + tz.getRawOffset()) / 1000;

这适用于“2010-01-01”和“2999-12-31”,但不适用于“0001-01-01”(预期:-62135596800,实际:-62135769600)-猜测缺少的“setGregorianChange”是这里的麻烦。

编辑 2

代码在 JsonSerializer 中运行。我有一个应用程序在 JSON 中显示那些 UNIX 时间戳。消费方期望时间戳为 GMT 时间戳,并将通过该时间戳将时区硬编码为 GMT 创建日期,但稍后将其用作本地时区。

为了更清楚地说明问题,我举个例子。

  • 我这边的日期:2010-01-01 (UTC+100)
  • 毫秒:1262300400000
  • 秒:1262300400

消费者现在需要这几秒钟并从中形成一个日期:

  • 2009 年 12 月 31 日星期四 23:00:00 GMT

当然 - 这是 100% 正确的,但消费者确实使用这个日期,就好像它是本地时区日期...

对于此示例,我希望传输的秒数为 1262300400 + 3600(我的 TZ 偏移量)。

编辑 3

我得到了 GregorianCalendar - 东西降到了 4liner - 但即使这样也比 Java 8 慢得多。问题是每次执行代码时都会创建一个新的 GregorianCalendar 对象。但这是必须做的,因为 Calendar 不是线程安全的。因此,快速解决方案必须以某种方式在没有任何对象实例化的情况下工作。下面的例子很像 EDIT 1,甚至比 Java 8 代码还要快。它只是无法正确处理 Julian -> Gregorian 开关 (15-Oct-1582) 之前的日期。

public class UnixTimestampSerializer extends JsonSerializer<Date> {

@Override
public void serialize(final Date dateObject, final JsonGenerator jgen, final SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeNumber((dateObject.getTime() - dateObject.getTimezoneOffset() * 60 * 1000) / 1000)
}
}

不幸的是,它可以 a) 使用已弃用的方法 b) 不能正确处理 1582 之前的日期 :(。使用静态 TimeZone.getDefault().getRawOffset() 来解决 a) 是不是一个选项,因为时区可能会在每个日期发生变化(夏季与冬季)。

最佳答案

java.sql.Date date = ...;
long unixTimestamp = date.getTime() / 1000;

关于java - 在 GMT 中获取 UNIX 时间戳的快速 Java 6 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32507520/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com