有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Android SimpleDataFormat中的java错误

我正在使用SimpleDataFormat在Android中格式化时间。目标是从包含以毫秒为单位的时间的long中获得一个人类可读的时间表示:

 var simpleDateFormat = SimpleDateFormat("s.SS")
 simpleDateFormat.timeZone = TimeZone.getTimeZone("UTC")
 var result = simpleDateFormat.format(timeInMillis)

我遇到了以下非常奇怪的错误:timeInMillis的最后一个数字是7或8,之前的数字是5,格式化是错误的,因为1/100秒的结果太小了

例如:

timeInMillis=1570

结果预期值:1.57

结果1.56的实际值

有人能重现这个错误吗?我在哪里可以报告


共 (1) 个答案

  1. # 1 楼答案

    我不知道你是怎么做的

    import java.text.SimpleDateFormat;
    import java.util.TimeZone;
    
    public class Main {
        public static void main(String args[]) {
            long timeInMillis = 1570;
            var simpleDateFormat = new SimpleDateFormat("s.SS");
            simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            var result = simpleDateFormat.format(timeInMillis);
            System.out.println(result);
        }
    }
    

    输出:

    1.570
    

    也可以在ideone上查看

    请注意java.util的日期时间API及其格式化API SimpleDateFormat已经过时,并且容易出错。建议完全停止使用它们,并切换到modern date-time API。在Trail: Date Time了解有关现代日期时间API的更多信息

    注意:如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

    使用现代日期时间API:

    import java.time.Instant;
    import java.time.LocalTime;
    import java.time.ZoneOffset;
    import java.time.format.DateTimeFormatter;
    
    public class Main {
        public static void main(String args[]) {
            long timeInMillis = 1570;
            var dtf = DateTimeFormatter.ofPattern("s.SS");
            LocalTime time = Instant.ofEpochMilli(timeInMillis).atOffset(ZoneOffset.UTC).toLocalTime();
            System.out.println(time.format(dtf));
        }
    }
    

    输出:

    1.57