【问题标题】:Only one expression to get the Date of yesterday and the first day of month只有一个表达式可以获取昨天的日期和一个月的第一天
【发布时间】:2010-08-12 12:57:44
【问题描述】:

我正在使用只支持一行表达式的报告工具

例如我想获取昨天的日期

Calendar 类有一个 add 方法,但是它返回 void 所以

Calendar.getInstance().add(Calendar.DAY_OF_MONTH,-1).getTime()

没用

不知道怎么做

谢谢

【问题讨论】:

  • 昨天的日期是什么格式?作为日历对象?作为字符串?作为 util.Date?作为 sql.Date?

标签: java date


【解决方案1】:

使用Joda-Time:

new org.joda.time.DateTime().minusDays(1).toDate();

【讨论】:

  • 当然,joda 又一次,但如果他仅限于单行,那么我实际上怀疑他是否可以包含 3rd-party 库。
【解决方案2】:

如果它真的必须是单行的并且代码是否可以理解并不重要,我认为以下语句应该有效:

Date yesterday = new SimpleDateFormat("yyyyMMdd").parse(
    ""+(Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()))-1));

它将当前日期格式化为“yyyyMMdd”,例如今天的“20100812”,将其解析为int:20100812,减一:20100811,然后使用以前的格式解析日期“20100811”。如果今天是一个月的第一天,它也可以工作,因为一个月的 0 号被宽松的 DateFormat 解析为上个月的最后一天。

“yyyyDDD”格式应该也可以工作(D 是一年中的一天)。

对于当月的第一天,你可以使用类似的技巧:

Date firstday = new SimpleDateFormat("yyyyMMdd").parse(
    new SimpleDateFormat("yyyyMM").format(new Date())+"01");

【讨论】:

  • @jarnbjo 对不起,我重新检查了问题和您的答案,发现我完全误解了这个问题。你的答案是 100% 正确的。别往心里放。我的 cmets 没有意义,所以我删除了它们。
【解决方案3】:

你不能做类似的事情

new Date( new Date().getTime() - 86400000 );

要获取当前时间,减去一天中的毫秒数,然后从中构建一个新的日期对象?

【讨论】:

  • 也应该使用 System.currentTimeMillis() 而不是 new Date().getTime()
  • 我想这真的只是突出了 Java 日期库的问题......至少对我来说,创建昨天的日期对象不应该超过一个衬垫,并且不应该需要 Joda ...
  • 当我们更改为夏令时时将是一个 pb
【解决方案4】:

假设您想要一个 java.util.Date 对象(因为您在问题中使用了 getTime() 并返回一个 java.util.Date),您可以这样做:

// Get yesterday's date. System.currentTimeMillis() returns the
// number of milliseconds between the epoch and today, and the
// 86400000 is the number of milliseconds in a day.
new Date(System.currentTimeMillis() - 86400000);

糟糕,之前没有看到您每月第一天的查询。我想出了以下使用util.Date 来实现的方法,但我认为这是您想要切换到使用JodaCalendar 的时候...(亲爱的,请不要投票给我以下内容的可怕之处......)

// This will return the day of the week as an integer, 0 to 6.
new Date(System.currentTimeMillis() - ((new Date().getDate()-1) * 86400000)).getDay();

【讨论】:

    【解决方案5】:

    这应该如下进行:

    Calendar cal = Calendar.getInstance();
    cal .add(Calendar.DAY_OF_MONTH,-1);
    cal .getTime();
    

    当你这样做时:

    Calendar.getInstance().add(Calendar.DAY_OF_MONTH,-1).getTime()
    

    您实际上是在询问一个返回 void 的方法 (add()) 以运行 .getTime()。那是行不通的。

    【讨论】:

      【解决方案6】:

      这是我在 JasperReports 中使用的:

      // Today
      new java.util.Date().format('yyyy-MM-dd')
      // Yesterday
      new SimpleDateFormat("yyyy-MM-dd").format(new Date()-1)
      
      // First Day of current month
      new java.util.Date().format('yyyy') + "-" + new java.util.Date().format('MM') + "-01"
      

      我更喜欢使用 ISO 格式 YYYY-MM-DD,因为它在任何地方都能被识别并避免区域格式混淆(dd/mm 在日期字段中的位置)。

      【讨论】:

        【解决方案7】:
        //Yesterday (LocalDate)
        java.time.LocalDate.now().minusDays(1)
        
        //Yesterday (java.sql.Date)
        java.sql.Date.valueOf( java.time.LocalDate.now().minusDays(1) )
        
        //Yesterday (java.util.Date)
        java.util.Date.from( java.time.LocalDate.now().minusDays(1).atStartOfDay(java.time.ZoneId.systemDefault()).toInstant() )
        
        
        //First day of current month (LocalDate)
        java.time.LocalDate.now().withDayOfMonth(1)
        
        //First day of current month (java.sql.Date)
        java.sql.Date.valueOf( java.time.LocalDate.now().withDayOfMonth(1) )
        
        //First day of current month (java.util.Date)
        java.util.Date.from( java.time.LocalDate.now().withDayOfMonth(1).atStartOfDay(java.time.ZoneId.systemDefault()).toInstant() )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-31
          • 2010-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多