【问题标题】:Convert Current date to integer将当前日期转换为整数
【发布时间】:2012-08-22 06:50:38
【问题描述】:

我想将当前日期转换为整数值。默认情况下,它返回 long。当我尝试将 long 转换为整数,然后将整数值转换为日期时,意味着它显示 1970 年的日期,

 int i = (int) new Date().getTime();
 System.out.println("Integer : " + i);
 System.out.println("Long : "+ new Date().getTime());
 System.out.println("Long date : " + new Date(new Date().getTime()));
 System.out.println("Int Date : " + new Date(i));

输出如下:

Integer : 1292838124
Long : 1345617601771
Long date : Wed Aug 22 12:10:01 IST 2012
Int Date : Fri Jan 16 04:37:18 IST 1970

任何人请帮帮我,如何将当前日期转换为整数(10位数字)?

【问题讨论】:

  • o/p 是:整数:1293630553,长:1345618394201,长日期:2012 年 8 月 22 日星期三 12:23:14 IST 2012,国际日期:1970 年 1 月 16 日星期五 04:50:30 IST跨度>
  • 我认为你给出了错误的输出
  • 对不起我的错误..现在我改变它
  • 是否需要整数,因为 jdbc 操作正在使用preparedStatement.setInt(aInt)?

标签: java date


【解决方案1】:

问题是 Integer 不够大,无法存储当前日期,您需要使用 Long。

日期在内部存储为自 1970 年 1 月 1 日以来的毫秒数。

最大整数值为 2147483648,而自 1970 年以来的毫秒数目前约为 1345618537869

将最大整数值放入日期中得出 1970 年 1 月 26 日星期一。

编辑:根据以下评论显示除以 1000 的代码:

    int i = (int) (new Date().getTime()/1000);
    System.out.println("Integer : " + i);
    System.out.println("Long : "+ new Date().getTime());
    System.out.println("Long date : " + new Date(new Date().getTime()));
    System.out.println("Int Date : " + new Date(((long)i)*1000L));

Integer : 1345619256
Long : 1345619256308
Long date : Wed Aug 22 16:37:36 CST 2012
Int Date : Wed Aug 22 16:37:36 CST 2012

【讨论】:

  • 谢谢你,我接受你的回答。但我的要求是只保持整数不长..有没有其他方法可以实现我的要求。
  • 如果您愿意接受一秒的分辨率(您将丢失日期的毫秒部分),那么您可以在存储整数之前除以 1000。并乘以转换回来。然而,它的寿命是有限的(一种千年虫问题)——直到 2038 年。
  • 我已经在我的答案中添加了代码来演示上面的建议
  • 仅供参考,自 1970 年 UTC 开始计算整秒而忽略闰秒称为Unix Time
【解决方案2】:

为了获取当前日期为整数(10 位数字),您需要将 new Date().getTime() 返回的 long 除以 1000。

这将在 int 范围内,有效期至 2038 年 1 月 18 日。

【讨论】:

    【解决方案3】:

    如果您只需要一个表示自 1970 年 1 月 1 日以来经过的天数的整数,您可以尝试以下方法:

    // magic number=
    // millisec * sec * min * hours
    // 1000 * 60 * 60 * 24 = 86400000
    public static final long MAGIC=86400000L;
    
    public int DateToDays (Date date){
        //  convert a date to an integer and back again
        long currentTime=date.getTime();
        currentTime=currentTime/MAGIC;
        return (int) currentTime; 
    }
    
    public Date DaysToDate(int days) {
        //  convert integer back again to a date
        long currentTime=(long) days*MAGIC;
        return new Date(currentTime);
    }
    

    较短但可读性较差(稍微快一点?):

    public static final long MAGIC=86400000L;
    
    public int DateToDays (Date date){
        return (int) (date.getTime()/MAGIC);
    }
    
    public Date DaysToDate(int days) {
        return new Date((long) days*MAGIC);
    }
    

    希望这会有所帮助。

    编辑:这可以工作到周五 7 月 11 日 01:00:00 CET 5881580

    【讨论】:

      【解决方案4】:

      tl;博士

      Instant.now().getEpochSecond()  // The number of seconds from the Java epoch of 1970-01-01T00:00:00Z.
      

      详情

      正如其他人所说,32-bit 整数不能容纳从纪元(UTC 时间从 1970 年开始)到现在的秒数。您需要 64-bit 整数(long 原语或 Long 对象)。

      java.time

      其他答案是使用旧的旧日期时间类。它们已被 java.time 类取代。

      Instant 类代表UTC 中时间轴上的一个时刻,分辨率为nanoseconds

      Instant now = instant.now() ;
      

      您可以询问自纪元以来的毫秒数。请注意,这意味着数据丢失,从纳秒到毫秒。

      long millisecondsSinceEpoch = now.toEpochMilli() ;
      

      如果您想计算 epoch 以来的纳秒数,您需要做一些数学运算,因为该类奇怪地缺少 toEpochNano 方法。请注意附加到十亿后的L 以引发计算为 64 位长整数。

      long nanosecondsSinceEpoch = ( instant.getEpochSecond() * 1_000_000_000L ) + instant.getNano() ;
      

      自纪元以来的整秒

      但问题的结尾要求输入 10 位数字。我怀疑这意味着自 1970-01-01T00:00:00 纪元以来的秒计数。这通常称为Unix Time 或 Posix Time。

      我们可以向Instant 询问这个号码。同样,这意味着数据丢失,该对象可能保留的任何几分之一秒都会被截断。

      long secondsSinceEpoch = now.getEpochSecond() ;  // The number of seconds from the Java epoch of 1970-01-01T00:00:00Z.
      

      关于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

      【讨论】:

        【解决方案5】:

        你需要这样的东西吗(没有时间)?

        public static Integer toJulianDate(Date pDate) {
        if (pDate == null) {
          return null;
        }
        Calendar lCal = Calendar.getInstance();
        lCal.setTime(pDate);
        int lYear = lCal.get(Calendar.YEAR);
        int lMonth = lCal.get(Calendar.MONTH) + 1;
        int lDay = lCal.get(Calendar.DATE);
        int a = (14 - lMonth) / 12;
        int y = lYear + 4800 - a;
        int m = lMonth + 12 * a - 3;
        return lDay + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045;
        }
        

        【讨论】:

        • @Stefan 谢谢你的解决方案。但是你能解释一下这里发生了什么吗?
        【解决方案6】:

        我已经解决了,如下所示:

            long year = calendar.get(Calendar.YEAR);
            long month = calendar.get(Calendar.MONTH) + 1;
            long day = calendar.get(Calendar.DAY_OF_MONTH);
            long calcDate = year * 100 + month;
            calcDate = calcDate * 100 + day;
            System.out.println("int: " + calcDate);
        

        【讨论】:

        • 这个问题已经解决了,而且已经有2年多了,似乎没有理由再补充一个答案了。
        • 这个答案没有解决这个问题。问题询问如何将数字放入int 而不是longcorrect accepted answer 解释说这是不可能的。
        【解决方案7】:

        试试这个

        Calendar currentDay= Calendar.getInstance();
        int currDate= currentDay.get(Calendar.DATE);
        int currMonth= currentDay.get(Calendar.MONTH);
        int currYear= currentDay.get(Calendar.YEAR);
        System.out.println(currDate + "-" +  currMonth + "-" + currYear);
        

        另一种使用 LocalDate 的方法。

        LocalDate today = LocalDate.now();
        int currentDate= today.getDayOfMonth();
        int currentMonth= today.getMonthValue();
        int currentYear= today.getYear()
        

        【讨论】:

        • 感谢您的贡献。恐怕你误解了这个问题(或者我做了)。提问者希望将当前时刻表示为 one 整数。不是月份、月份和年份的三个整数。此外,Calendar 类早已过时且设计不佳,不再推荐。而且我们每月得到 7 个,而大多数人预计 8 月份会得到 8 个。
        • 也许我误解了这个问题。关于不推荐使用 Calendar 类,我今天才发现这个问题并尝试了使用 LocalDate 的替代方法。今天的 LocalDate = LocalDate.now(); int currentDate=今天.getDayOfMonth(); int currentMonth= today.getMonthValue(); int currentYear= today.getYear();
        【解决方案8】:

        您的问题是因为 getTime() 。它总是返回跟随。

        返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

        因为最大整数值小于getTime() 的返回值,所以显示 结果错误。

        【讨论】:

          【解决方案9】:

          在我的 Java 7 上,输出不同:

          Integer : 1293732698
          Long : 1345618496346
          Long date : Wed Aug 22 10:54:56 MSK 2012
          Int Date : Fri Jan 16 02:22:12 MSK 1970
          

          这是预期的行为。

          不可能将当前日期以毫秒为单位显示为整数(10 位数字),因为可能的最新日期是Sun Apr 26 20:46:39 MSK 1970

          Date d = new Date(9999_9999_99L);
          System.out.println("Date: " + d);
          
          Date: Sun Apr 26 20:46:39 MSK 1970
          

          您可能需要考虑以秒/分钟为单位显示它。

          【讨论】:

            【解决方案10】:

            可能你不能,Long 是比 Integer 更高的数据类型。

            或者这个链接可能对你有帮助

            http://www.velocityreviews.com/forums/t142373-convert-date-to-integer-and-back.html

            【讨论】:

            • 请不要在答案中包含“签名”或您的网站链接。您可以将该信息放入您的个人资料中。
            【解决方案11】:

            Simple 真正创建一个长变量来表示您的程序的默认开始日期 获取另一个长变量的日期。 然后扣除长开始日期并转换为整数瞧 要读取并转换回来,只需加法而不是减法。 显然,这取决于您需要多大的日期范围。

            【讨论】:

              【解决方案12】:

              Java Dateint 的转换:

              public static final String DATE_FORMAT_INT = "yyyyMMdd";
              
              public static String format(Date date, String format) {
                  return isNull(date) ?  
                  null : new SimpleDateFormat(format).format(date);
              }
              
              public static Integer getDateInt(Date date) {
                  if (isNull(date)) {
                      throw new IllegalArgumentException("Date must not be NULL");
                  }
              
                  return parseInt(format(date, DATE_FORMAT_INT));
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-08-17
                • 2018-10-16
                • 2022-07-07
                • 1970-01-01
                相关资源
                最近更新 更多