JAVA如何取得上一个月的同一天

cph1737 2011-09-22 06:30:31
现在碰到这样一个问题,写一个函数实现取这一天的上个月的那一天。说明:像有些月的前一个月是没有31号的,则默认用这个月的31号去与上个月的30;另外2月份也是一个特殊的月,闰年时为29天,非闰年为28天,所以闰年的3月份的30,31的上个月为29号,非闰年的29,30,31号的上一个月的同一天为28号。还有就是这个月是1月,这上个月是去年的12月。
通过传入一个yyyymmdd的数据,如何实现上述需求,成功取得上一个月的同一天,请各位JAVA高手相助!!
...全文
744 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fainfy 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 devil26 的回复:]

Java code
GregorianCalendar calendar = new GregorianCalendar(2011, 9, 31);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM//dd");
System.out.println(sdf.format(calendar.getTime(……
[/Quote]

噢,明白了。
如果时间超出了范围,就会取当月的最大值。
fainfy 2011-09-22
  • 打赏
  • 举报
回复

public class Test {

public Date getBefore(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

long millis = getBefore(calendar);
calendar.setTimeInMillis(millis);

return calendar.getTime();
}

private long getBefore(Calendar c) {
int month = (c.get(Calendar.MONTH) + 1);
int day = c.get(Calendar.DATE);
long monthMillis = 0;

switch (month) {
// 其它月份都减去31天
// 10月31对应9月30
// 11月30对应10对30
case 1:
case 2:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 11:
case 10:
case 12:
monthMillis = calculateMillis(31);
break;
default:
int febDay = 28;
if (isLeapYear(c)) {
febDay = 29;
}
// 大于2月的天数,则减去当前天数
if (day > febDay) {
monthMillis = calculateMillis(day);
} else {
// 否则减去2月的天数
monthMillis = calculateMillis(febDay);
}
break;
}
System.out.println(monthMillis);
return (c.getTimeInMillis() - monthMillis);
}

private long calculateMillis(int month) {
return month * (long) 24 * 60 * 60 * 1000;
}

private boolean isLeapYear(Calendar calendar) {
int year = calendar.get(Calendar.YEAR);
return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
}

public static void main(String[] args) throws Exception {

String source = "20001031";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date = sdf.parse(source);
//
Test t = new Test();
Date beforeMonth = t.getBefore(date);
System.out.println(sdf.format(beforeMonth));
}
}


这个是完全按照楼主题目要求的意思来做的。
TKD03072010 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 devil26 的回复:]

Java code
GregorianCalendar calendar = new GregorianCalendar(2011, 9, 31);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM//dd");
System.out.println(sdf.format(calendar.getTime(……
[/Quote]
用API 实现
不用编写复杂的过程
顶一下
楼主 写Java 应该去看看API文档
fainfy 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 niuniu20008 的回复:]

引用 6 楼 fainfy 的回复:
我没有仔细看题目,在此向楼主道歉,我给你把问题解出来了。
楼主可以查看一下代码。思路比较简单。

Java code

public class Test {

public Date getBefore(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.s……
[/Quote]
你哪里看出来我错了?
fainfy 2011-09-22
  • 打赏
  • 举报
回复
不过我怎么看感觉楼主的题目有问题啊。
润年:3月31 对应 2月29号
那润年:3月1号 难道也要对应 2月1号吗?还是1月30号啊?
niuniu20008 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 fainfy 的回复:]
我没有仔细看题目,在此向楼主道歉,我给你把问题解出来了。
楼主可以查看一下代码。思路比较简单。

Java code

public class Test {

public Date getBefore(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.se……
[/Quote]
你错的可爱,楼主头像很好啊
fainfy 2011-09-22
  • 打赏
  • 举报
回复
我没有仔细看题目,在此向楼主道歉,我给你把问题解出来了。
楼主可以查看一下代码。思路比较简单。

public class Test {

public Date getBefore(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

long millis = getBefore(calendar);
calendar.setTimeInMillis(millis);

return calendar.getTime();
}

private long getBefore(Calendar c) {
int month = (c.get(Calendar.MONTH) + 1);
long monthMillis = 0;
switch (month) {
// 31 day
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
monthMillis = calculateMillis(31);
break;
// 30 day
case 4:
case 6:
case 9:
case 11:
monthMillis = calculateMillis(30);
break;
// 2 month
default:
if (isLeapYear(c)) {
monthMillis = calculateMillis(29);
} else {
monthMillis = calculateMillis(28);
}
break;
}
System.out.println(monthMillis);
return (c.getTimeInMillis() - monthMillis);
}

private long calculateMillis(int month) {
return month * (long) 24 * 60 * 60 * 1000;
}

private boolean isLeapYear(Calendar calendar) {
int year = calendar.get(Calendar.YEAR);
return (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0));
}

public static void main(String[] args) throws Exception {

String source = "20110922";
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date date = sdf.parse(source);
//
Test t = new Test();
Date beforeMonth = t.getBefore(date);
System.out.println(sdf.format(beforeMonth));
}
}
Devil26 2011-09-22
  • 打赏
  • 举报
回复
GregorianCalendar calendar = new GregorianCalendar(2011, 9, 31);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM//dd");
System.out.println(sdf.format(calendar.getTime()));
for (int i = 0; i < 100; i++) {
calendar.add(Calendar.MONTH, -1);
System.out.println(sdf.format(calendar.getTime()));
}
huntor 2011-09-22
  • 打赏
  • 举报
回复
joda-time

class DateTime 从 3-31 减去 1 个月后得到 2-28
fainfy 2011-09-22
  • 打赏
  • 举报
回复
我错了。。。。。。。。。。。。。。
fainfy 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fainfy 的回复:]

那我弱弱的一下。
3月有31天。
2月最多也就29天。
那3月能取到2月的同一天时间吗?
[/Quote]
我是指29号以后的。
fainfy 2011-09-22
  • 打赏
  • 举报
回复
那我弱弱的一下。
3月有31天。
2月最多也就29天。
那3月能取到2月的同一天时间吗?

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧