excel时间java_java – 在Excel中混淆日期和时间

我有

Java时间(自UTC时间1970年1月1日以来的ms),并希望将该时间写入csv文件,以便Excel可以正确解释和格式化它.我明白,excel使用“序列日期时间”作为格式 – 这是一个浮点数,其中整数部分给出自19/1/19以来的天数,小数部分给出一天的分数.

我无法理解时区和夏令时处理.

This page说excel纪元(1/1/1900)是基于本地(=计算机创建Excel文件?)时区.这意味着序列日期并不表示没有计算机时区创建它的信息的唯一时刻.不是我会选择的,但没关系.

现在接受这个,我相信我可以通过以下Java代码将Java时间转换为Excel序列日期(nb:我在苏黎世,CET时区):

private static final long ONE_HOUR= 60L * 60 * 1000;

private static final long ONE_DAY = 24 * ONE_HOUR;

private static final long excelEpoch;

static{

Calendar cal;

cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Zurich"));

cal.set(Calendar.YEAR, 1900);

cal.set(Calendar.DAY_OF_YEAR, 1);

cal.set(Calendar.HOUR_OF_DAY, 0);

cal.set(Calendar.MINUTE, 0);

cal.set(Calendar.SECOND, 0);

cal.set(Calendar.MILLISECOND, 0);

excelEpoch = cal.getTimeInMillis();

}

private static String formatForExcel(long time){

return ""+(time-excelEpoch)/(double)ONE_DAY;

}

使用这个我可以打印几次:

public static void main(String[] args) {

String sep = "\t"; // csv field separator

SimpleDateFormat fmt = new SimpleDateFormat("HH:mm:ss d/M/yyyy");

fmt.setTimeZone(TimeZone.getTimeZone("Europe/Zurich"));

System.out.println("Time in ms since 1/1/1970 UTC"+ sep + "Time as string" + sep + "Excel serial" + sep + "Excel serial formatted by excel");

long startTime = 1332630000000L; // 25/3/2012 00:00 CET , shortly before change from winter time to DST

for (long t = startTime; t < startTime + 4*ONE_HOUR; t+=ONE_HOUR) {

System.out.println(t + sep + fmt.format(new Date(t)) + sep + formatForExcel(t) + sep + formatForExcel(t));

}

}

哪个回报

Time in ms since 1/1/1970 UTC Time as string Excel serial Excel serial formatted by excel

1332630000000 00:00:00 25/3/2012 40991.0 40991.0

1332633600000 01:00:00 25/3/2012 40991.041666666664 40991.041666666664

1332637200000 03:00:00 25/3/2012 40991.083333333336 40991.083333333336

1332640800000 04:00:00 25/3/2012 40991.125 40991.125

请注意,从冬季到夏令时的变化发生在那些时间(检查第二列,缺少第2小时).

现在出现了困惑.如果我将其粘贴到excel中,并且对于最后一列选择“格式化单元格…”然后选择“时间”(任何格式),它将打印:

Time in ms since 1/1/1970 UTC Time as string Excel serial Excel serial formatted by excel

1332630000000 25.03.2012 00:00 40991 0:00:00

1332633600000 25.03.2012 01:00 40991.04167 1:00:00

1332637200000 25.03.2012 03:00 40991.08333 2:00:00

1332640800000 25.03.2012 04:00 40991.125 3:00:00

请注意,在格式化序列日期方面表现优异,不会更改为DST.所以这不是挂钟时间.

长话短说:

我应该如何将Java时间转换为Excel才能使其正常工作?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值