一步一步,使用 Joda:
计算中使用的数据可以在您引用的网站上找到您提供的其他参考说明 TOD 以 UTC 表示
// we start with your string minus the three last digits
// which are some internal z/Series cruft
BigInteger bi = new BigInteger ("CAE7631DC43DC", 16); // 686 stripped off
// then, from tables the website we get the TOD value for start of epoch
// here also, minus the three last digits
BigInteger startOfEpoch70 = new BigInteger ("7D91048BCA000", 16); // 000 stripped off
// using that we calculate the offset in microseconds in epoch
BigInteger microsinepoch = bi.subtract(startOfEpoch70);
// and reduce to millis
BigInteger millisinepoch = microsinepoch.divide(new BigInteger("1000"));
// which we convert to a long to feed to Joda
long millisinepochLong = millisinepoch.longValue();
// Et voila, the result in UTC
DateTime result = new DateTime(millisinepochLong).withZone(DateTimeZone.UTC);
// Now, if you want a result in some other timezone, that's equally easy
// with Joda:
DateTime result2 = result.toDateTime(DateTimeZone.forID("EET"));
System.out.println("The result is " + result + " or represented in timezone EET "
+ result2);
这给出了这个输出:
结果为 2013-02-10T21:59:46.420Z 或以 EET 时区 2013-02-10T23:59:46.420+02:00 表示
我所指的“cruft”解释如下:
我们跳过最后 12 位(通常,这些位中的一些位被 MVS 用来判断哪个处理器用于读取 TOD 时钟以及哪个 LPAR 处于活动状态)。
当然,与其从字符串中粗暴地剪掉这些字节,还可以这样做
bi = bi.divide(new BigInteger("1000", 16));
因为除以十六进制 1000 也会去掉最后 12 位。
编辑:正如 Mehmet 在评论中指出的那样,TOD 是 UTC,这意味着应该告诉生成的 DateTime。为方便起见,我还展示了如何将该 DateTime 转换为另一个时区(EET
用作示例)