2017-09-26 114 views
1

我已创建了时间表达式几个变量,创建基于时间的报告:如何显示前一个月的最后一天相对于某个日期?

// First of month (Returns 01/09/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse("01/" + MONTH(NOW()) + "/" + YEAR(NOW()))) 

// First of previous month (Returns 01/08/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse("01/" + (MONTH(NOW()) - 1) + "/" + YEAR(NOW()))) 

// Last of month (Returns 30/09/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse(MONTH(NOW()) + "/" + DAYSINMONTH(NOW())+ "/" + YEAR(NOW()))) 

我现在得到上月的最后一天挣扎。我尝试了类似下面的内容,但这当然不能正常工作,因为不是所有的月份都有相同的天数。

// Last of previous month (Returns 30/08/2017) 
new SimpleDateFormat("MM/dd/yyyy").format(java.util.Date.parse(
    (MONTH(NOW()) - 1) 
    + "/" + 
    DAYSINMONTH(NOW()) 
    + "/" + 
    YEAR(NOW()) 
)) 

你知道一种检索上个月最后一天的方法吗?

参考:http://community.jaspersoft.com/questions/843248/last-day-current-month

+0

我最近通过在select语句中使用SQL实例来实现它。尽管如此,仍然对智能解决方案感兴趣 – user2663557

回答

0

我可能已经解决了这个使用Java创建一个静态类,是以日期为参数,然后使用Calendar API或类似返回所需的日期的方法,这是如何在java Calendar - Get last day of previous month中做到这一点。

然而,让有乐趣,只使用碧玉报告

既然我们不能使用日历API(它返回void),我们需要在org.apache.commons.lang.time.DateUtils回落again我的朋友Tunaki教我。

使用DateUtils我们可以称之为第一truncate用一个月(除去天),然后我们addDays -1(-1一天,如果我们在每月的第一个日期,它会给我们上月的最后一天)

DateUtils.addDays(DateUtils.truncate(myDate, Calendar.MONTH),-1); 

JRXML例如

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="DateUtil" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f288086f-db4e-451f-bf32-e1cce6311a27"> 
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/> 
    <import value="java.util.Calendar"/> 
    <import value="org.apache.commons.lang.time.DateUtils"/> 
    <parameter name="date" class="java.util.Date"> 
     <defaultValueExpression><![CDATA[new Date()]]></defaultValueExpression> 
    </parameter> 
    <queryString> 
     <![CDATA[]]> 
    </queryString> 
    <title> 
     <band height="20" splitType="Stretch"> 
      <textField pattern="MM/dd/yyyy"> 
       <reportElement x="0" y="0" width="220" height="20" uuid="48878c52-5527-4784-a74a-e2d8df65cc55"/> 
       <textFieldExpression><![CDATA[DateUtils.addDays(DateUtils.truncate($P{date}, Calendar.MONTH),-1)]]></textFieldExpression> 
      </textField> 
     </band> 
    </title> 
</jasperReport> 

输出(有一天我过了这个答案)

result

设计笔记:你应该使用模式来格式化日期,因为我在我的例子做的,表达不使用SimpleDateFormat,使用模式如果导出例如脱颖而出会给你正确的对象。

相关问题