Java 以特定格式将毫秒转换为日期

Java 以特定格式将毫秒转换为日期,java,simpledateformat,Java,Simpledateformat,使用以下代码,输出为2016年3月15日06:24:41.296PM Date sDate=new Date(); SimpleDateFormat pattern = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss.SSSa"); System.out.println(pattern .format(sDate)); 如果我希望输出为2016年3月15日06:00:00.0PM是否可能?而不是使用日历将部分日期重置为零,您可以使用单引号在格式化日期中插入

使用以下代码,输出为2016年3月15日06:24:41.296PM

Date sDate=new Date();
SimpleDateFormat pattern = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss.SSSa");
System.out.println(pattern .format(sDate));

如果我希望输出为2016年3月15日06:00:00.0PM是否可能?

而不是使用
日历将部分日期重置为零,您可以使用单引号在格式化日期中插入文字字符串:

SimpleDateFormat pattern = new SimpleDateFormat("dd-MMM-yyyy hh:'00:00.0'a");

根据您是要截断(即地板)还是四舍五入到最近的一小时,您可以执行以下操作之一:

    final long MS_PER_HOUR = 1000L * 60 * 60;
    SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM-yyyy hh:mm:ss.SSSa");

    long now = System.currentTimeMillis();
    long trunc = (now / MS_PER_HOUR) * MS_PER_HOUR;
    long round = ((now + MS_PER_HOUR / 2) / MS_PER_HOUR) * MS_PER_HOUR;

    System.out.println("now:   " + fmt.format(new Date(now)));
    System.out.println("trunc: " + fmt.format(new Date(trunc)));
    System.out.println("round: " + fmt.format(new Date(round)));
将在09:00:00和09:29:59之间生成此输出

now:   15-Mar-2016 09:15:37.721AM
trunc: 15-Mar-2016 09:00:00.000AM
round: 15-Mar-2016 09:00:00.000AM
在09:30:00到09:59:59之间

now:   15-Mar-2016 09:45:50.925AM
trunc: 15-Mar-2016 09:00:00.000AM
round: 15-Mar-2016 10:00:00.000AM

您可能需要首先重置
日期的mm:ss.SSS部分,请参见此处:与其执行
新日期()
不如获取
日历
实例,并将分钟和秒设置为0。因此,实际上您想将日期四舍五入到小时分辨率?如果时间是5.59.59怎么办?为了避免任何混淆,您可以在回答中精确指出日期本身不会改变,只有格式化程序给出的视觉表示将被更改。@我不确定混淆在哪里-
SimpleDataFormat
从不更改它传递的日期。我认为如果检查此程序的输出可能会混淆:
date d=new date();SimpleDataFormat模式=新的SimpleDataFormat(“dd-MMM-yyy-hh:'00:00.0'a”);System.out.println(pattern.format(d));系统输出打印ln(d)
为同一对象提供了两种不同的视觉表示。如果发现
Date.toString()
满足您的要求,您为什么要首先使用
SimpleDataFormat
?作为人类,您可能会忘记在将来使用
SimpleDataFormat
。因此,在您的代码库中有一个回归,因为生成的表示与预期的表示不再匹配。