我正在尝试使用CreateDate在CFWheels和我得到愚蠢的错误,我将在秒中详细解释。
首先,这是我的代码
<cfscript>
lastM = dateFormat(CreateDate(year(now()),month(now())-1,day(now())),'MM');
d = DaysInMonth(lastM);
session.start = dateFormat(CreateDate(Year(rightnow),Month(lastM),Day(01)),'YYYY-MM-DD');
session.end = dateFormat(CreateDate(Year(rightnow),Month(lastM),Day(d)),'YYYY-MM-DD');
session.date = "last_month";
</cfscript>
正如您所看到的,我试图将会话变量start
和end
设置为"上个月"的开始和结束。当我转储lastM
和d
时,我得到了月份和DaysInMonth的正确值。当我在CreateDate
方法中使用这两个变量时,session.start
等于2013-01-31,session.end
等于2013-01-30。我试着用很多不同的方法来写这个方法,但我不明白是什么导致了这个问题。
我已经检查了这个问题Coldfusion CreateDate问题,但它与我所经历的不一样。
您正在滥用month()
函数。来自文档:
从日期/时间对象中提取月份值
传入一个数字,CF隐式地将其转换为日期(可能是01/03/1900),只是不是正确的数字。所以month()
实际上返回1
。这就是为什么你的结果是2013年1月。
更简单的方法是使用dateAdd
。只需计算当前月份的第一天。然后减去月或日,得到前一个月的开始和结束。(注意:我会将值保留为日期对象,只有在需要向用户显示它们时才"格式化"它们)。
<cfscript>
today = now();
firstOfThisMonth = CreateDate( year(today), month(today), 1);
firstOfLastMonth = dateAdd("m", -1, firstOfThisMonth);
endOfLastMonth = dateAdd("d", -1, firstOfThisMonth);
</cfscript>
从createDate的最后一个参数中删除您的日期函数。就用1
和d
吧