【问题标题】:What is my mistake to convert Date into minutes?将日期转换为分钟的错误是什么?
【发布时间】:2018-05-19 15:53:55
【问题描述】:

根据How to convert Standard Date into minutes in java? 信息,我按照这种技术将日期转换为分钟,但输出不是预期值(例如,12 小时 -> 应该是 720 分钟)。

这是我的源代码

    SimpleDateFormat sdf = new SimpleDateFormat("hh");
    Date theDate = sdf.parse ("12");
    long minutes22 = (theDate.getTime() / 1000)  / 60;
    System.out.println("Minute "+minutes22);

输出为 -420。谁能给我解释一下?

新问题是切割字符串。

对于另一个输入,我尝试做自己的解决方案,但是在完成切割字符串后出现问题。我发现重复值不能分开保存。我不知道为什么会发生,因为我保存在不同的索引中。有什么建议吗?

这是另一个我的另一个源代码。

    String date = "Sun 10:00-20:00\r\n" + 
            "Fri 05:00-10:00\r\n" + 
            "Fri 16:30-23:50\r\n" + 
            "Sat 10:00-24:00\r\n" + 
            "Sun 01:00-04:00\r\n" + 
            "Sat 02:00-06:00\r\n" + 
            "Tue 03:30-18:15\r\n" + 
            "Tue 19:00-20:00\r\n" + 
            "Wed 04:25-15:14\r\n" + 
            "Wed 15:14-22:40\r\n" + 
            "Thu 00:00-23:59\r\n" + 
            "Mon 05:00-13:00\r\n" + 
            "Mon 15:00-21:00";

    List<String> Hour = new ArrayList<String>();
    int loop = 0;

    String [] replacement = {"sun","mon","tue","wed","thu","fri","sat"};
    String new_s = date.toLowerCase().replaceAll(" ","");

    for(int j = 0;j<replacement.length;j++)
    {
        new_s = new_s.replace(replacement[j],"").replace("\r\n","");


    }

    String temp = "";
    temp = temp+new_s.replaceAll("-","");

    int show = 0;
    while(!temp.equals(""))
    {
        Hour.add(temp.substring(loop,loop+5));
        temp = temp.replace(temp.substring(0,loop+5),"");
        System.out.println("Hour "+Hour.get(show));
        show++;

    }

这是输出

Hour 10:00 Hour 20:00 Hour 05:00 Hour 16:30 Hour 23:50 Hour 24:00 Hour 01:00 Hour 04:00 Hour 02:00 Hour 06:00 Hour 03:30 Hour 18:15 Hour 19:00 Hour 04:25 Hour 15:14 Hour 22:40 Hour 00:00 Hour 23:59 Hour 13:00 Hour 15:00 Hour 21:00

另一个问题 - 为什么会打印出

 LocalTime froms = LocalTime.parse("20:00", DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH));
System.out.println("TIme "+froms.getMinute());'

【问题讨论】:

  • 会不会是时区问题?
  • 也可以试试 TimeUnit.HOURS.toMinutes(12) // 720
  • 尝试打印日期,你会看到问题,解析产生了错误的日期。将 hh 更改为 HH 即可(取决于时区问题)。
  • 看看this answer
  • 您是否仍然使用旧的 Date API (Date) 而不是新的 (LocalDate, LocalDateTime, ...)?

标签: java duration datetime-conversion minute


【解决方案1】:

tl;博士

Duration.ofHours(12).toMinutes()

720

java.time.Duration

您正在使用有问题的旧旧日期时间类。而且,你还在被他们滥用。

Date 类已替换为 Instant 类。两者都代表一个时刻,时间轴上的一个点。不要滥用它们来代表“十二小时”。

显然,您想要表示一个与时间轴无关的时间跨度。所以请使用为此目的设计的类,Duration

Duration d = Duration.ofHours(12);

要查看整个持续时间的总分钟数,请致电toMinutes

long minutes = d.toMinutes();

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:
        String input = "Sun 11:00-20:00";
        String[] fromAndTo = input.split("-");
        LocalTime from = LocalTime.parse(fromAndTo[0], DateTimeFormatter.ofPattern("EEE H:mm", Locale.ENGLISH));
        LocalTime to = LocalTime.parse(fromAndTo[1]);
        System.out.println(Duration.between(from, to).toMinutes());
    

    这个打印出来的:

    540

    谁能给我解释一下?

    你有两个错误都导致你的错误结果:

    • 您在一段时间内滥用了 Date 并且没有指定时区。
    • 您在格式化模式字符串中使用了小写hh 几个小时。 hh 表示上午或下午从 01 到 12 的小时,因此 12 表示与 0 相同(因为 12:00 AM 与 24 小时制的 00:00 相同)。

    您的 SimpleDateFormat12 理解为您本地时区的 00:00(由您的 JVM 时区设置定义)。但是,当您使用 theDate.getTime() 取出毫秒时,您将获得自 UTC 00:00 以来的毫秒数。由于您的时区与 UTC 有偏差,因此您会收到关于此偏差量级的错误。

    【讨论】:

    • 可能。在这种情况下,我会先在“\r\n”(或“[\r\n]+”)上拆分成行,然后在“-”上拆分每一行。
    • 即时建议是temp = temp.substring(5);。但是根据您的确切要求,我认为在"\r\n" 上拆分然后使用答案中的代码会更好。
    • 20:00 表示一天中的小时是 20,分钟是 0。所以froms.getHour() 给你 20,froms.getMinute() 给你 0。你的解析是正确的,你有得到了预期的LocalTime 值。
    • 我想我明白了!使用 Duration.between("00:00" to "20:30") ??
    • 应该可以,@Mr.Kim。试试吧。 "00:00" 可以表示为LocalTime.MINLocalTime.MIDNIGHT(随你喜欢)。
    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多