【问题标题】:Problems in converting a given date to minutes将给定日期转换为分钟的问题
【发布时间】:2020-06-17 13:50:55
【问题描述】:

我有一个函数,我可以获取日期并将其转换为毫秒,然后将其更改为分钟。最终值始终为正值,但由于某些未知原因,从 6 月 5 日到 6 月 29 日,结果值变为负值。因此,我期望正值的后续操作会受到影响。这个问题的根本原因是什么?我附上了我的一段代码,其中包含不同日期的不同结果快照。任何人都可以建议解决此问题的方法吗?我正在使用 java 版本“1.8.0_161”

String democurrentDate = "Wed Jul 4 17:28:41 IST 2020";                    
Date entrydatecom = new Date();
entrydatecom = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(democurrentDate);
System.out.println("The current date in correct format for milli ==>" + entrydatecom);                    
int milli1 = (int) entrydatecom.getTime();
System.out.println("Milli === > " + milli1);
long minutesforcurr = TimeUnit.MILLISECONDS.toMinutes(milli1);
System.out.println("The minutes for current date is ==> " + minutesforcurr);

当日期是 7 月 4 日时

milli 格式正确的当前日期 ==>Sat Jul 04 17:28:41 IST 2020
Milli === > 431054184
当前日期的分钟数是 ==> 7184

当日期是 6 月 4 日时

milli 格式正确的当前日期 ==>Thu Jun 04 17:28:41 IST 2020
Milli === > 2134021480
当前日期的分钟数 是 ==> 35567

当日期是 6 月 17 日时

milli 格式正确的当前日期 ==>Wed Jun 17 17:28:41 IST 2020
Milli === > -1037745816
当前日期的分钟数 是 ==> -17295

当日期是 6 月 22 日时

milli 格式正确的当前日期 ==>Mon Jun 22 17:28:41 IST 2020
Milli === > -605745816
当前日期的分钟数 是 ==> -10095

【问题讨论】:

  • 请澄清“将其转换为毫秒”的含义。转换成什么样的毫秒?自 Unix 纪元以来的毫秒数?自其他纪元以来的毫秒数?目前您正在将long 转换为int,因此您几乎肯定会在那里丢失信息,这解释了为什么您会得到负值。但是,如果不知道您期望结果是什么以及为什么,我们就无法真正帮助您。
  • 除了强制转换为 longint 之外,您是来自 java.util 的过时日期时间类...使用 java.time 代替它们。
  • 我建议你不要使用SimpleDateFormatDate。这些类设计不佳且早已过时,尤其是前者,尤其是出了名的麻烦。而是使用ZonedDateTimeDateTimeFormatterZoneIdInstantDuration,均来自java.time, the modern Java date and time API

标签: java date datetime java-8 datetime-format


【解决方案1】:

你应该使用 long,不要强制转换为 int。

【讨论】:

    【解决方案2】:

    问题

    您的日期/时间字符串中的一个主要问题是 2020 年 7 月 4 日是 Sat,而您写的是 Wed,因此它要么无法正确解析,要么会引发异常。

    除此之外,我建议您使用modern date/time API 而不是使用损坏的java.util.DateSimpleDateFormat

    import java.time.LocalDateTime;
    import java.time.ZoneId;
    import java.time.ZonedDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.temporal.ChronoUnit;
    
    class Main {
        public static void main(String[] args) {
            // Define format
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM d HH:mm:ss zzz yyyy");
    
            // Parse to ZonedDateTime
            ZonedDateTime zdt = LocalDateTime.parse("Sat Jul 4 17:28:41 IST 2020", formatter)
                    .atZone(ZoneId.of("Asia/Kolkata"));
    
            // Calculate duration in minute
            long minutes = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")).until(zdt, ChronoUnit.MINUTES);
    
            // Display
            System.out.println(minutes);
        }
    }
    

    输出:

    24333
    

    【讨论】:

      【解决方案3】:

      使用:Long milli1 = entrydatecom.getTime(); 当您将 long 转换为 int 时,您会丢失大量数据。 一个 int 数字可以支持介于:-2147483648 和 2147483647 之间的数字 长数介于 -9,223,372,036,854,775,808 和 9,223,372,036,854,775,807 之间

      例如,如果您正在测试“Wed Jun 17 17:28:41 IST 2020”,则毫秒数将为: 1592407721000 ( > 2147483647 ) 放不下

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-06
        相关资源
        最近更新 更多