避免Double上的舍入误差 - >日期转换

时间:2013-04-27 18:20:14

标签: java date time type-conversion

在我的程序中,我收到定义时间戳的字符串,以毫秒为单位。现在我需要将其转换为正确的日期。我发现的解决方案看起来像这样:

String aTime = "1365504203.0269";
double t = Double.parseDouble(aTime);

Date date = new Date((long)t*1000);
SimpleDateFormat dateFormatDDMMYYYY = new SimpleDateFormat("dd.MM.yyyy");
SimpleDateFormat dateFormatHHMMssSS = new SimpleDateFormat("HH:mm:ss:SS");
String day = new String(dateFormatHHMMssSS.format(date));
String hour = new String(dateFormatDDMMYYYY.format(date));

System.out.println("The Date: "+day);
System.out.println("The Time: "+hour);

不幸的是,这会从时间戳中删除毫秒的准确度。 (我不确定时间是否准确,因为我几乎无法想到它。)

是否由于双重转换而丢失,或者它从未出现过?有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

问题出在这句话中:

Date date = new Date((long)t*1000);

它首先将double转换为长整数,从而截断小数位,然后乘以1000,这只会增加三个零。试试这个:

Date date = new Date((long)(t*1000.0));

它使用double作为乘法的数据类型,将小数位移到整数部分,然后使小数位截断long转换。

使用1000.0代替1000作为常量也会强制常量为double类型,增加额外的确定性,即乘法将在双精度时发生。