Java DateFormat for 2 millisecond precision

2019-06-27 21:10发布

问题:

I'm having a problem with trying to get the DateFormat library to give me a String with the date to be formatted with 2 millisecond places instead of the usual 3. I realize this is more along the line of centi-seconds, but afaik Java doesn't support that.

Here is some code to show the problem I am having. I would expect it to output to two milliseconds, but it outputs three.

public class MilliSeconds {
private static final String DATE_FORMAT_2MS_Digits = "yyyy-MM-dd'T'HH:mm:ss.SS'Z'";
private static DateFormat dateFormat2MsDigits = new SimpleDateFormat(DATE_FORMAT_2MS_Digits);

public static void main( String[] args ){
    long milliseconds = 123456789123l;
    System.out.println(formatDate2MsDigits(new Date(milliseconds)));
}

public static String formatDate2MsDigits(Date date)
{
    dateFormat2MsDigits.setCalendar(Calendar.getInstance(new SimpleTimeZone(0, "GMT")));
    return dateFormat2MsDigits.format(date);
}}

outputs:

1973-11-29T21:33:09.123Z

I could just parse the resulting string and remove the digit I don't want, but I was hoping there would be a cleaner way to achieve this. Does anyone know how to get this to work, or why it is not working?

回答1:

Sorry. Acording to the javadoc

the number of letters for number components are ignored except it's needed to separate two adjacent fields

...so I don't think there's a direct way to do it.

I would use a separate format only for SSS and call substring(0, 2).



回答2:

I haven't been able to deduce why is the problem happening, but after replacing date format with yoda, the generated time string had correct number number of seconds [ only 2].



回答3:

I would include Joda Time and use something like:

private static final String DATE_FORMAT_2MS_FMT = "yyyy-MM-dd'T'HH:mm:ss.SS'Z'";

private static final DateTimeFormatter DATE_FORMAT_2MS_DIGITS = DateTimeFormat
        .forPattern(DATE_FORMAT_2MS_FMT).withZoneUTC();

public static String formatDate2MsDigits(Date date) {
    return DATE_FORMAT_2MS_DIGITS.print(date.getTime());
}

If you don't want the additional dependency, I think twiddling the result string from .format(...) is the only way.