荣耀8/16-年月日转换

某公司每月要举行一次或者多次聚餐,由团队领导随机桃选当月的一周的某一天,公司档案记录的是某年某月第几个周周几这样的记录,有一天领导希望能够管理一下,将这些记录转换为公历日期,由于历史记录众多,秘书MM觉得手动去查很辛苦,需要身为程序员的你帮忙解决下,将这些记录转换为公历日期
1其中有一部分记录记错了,比如2018年2月第8周周一;对于这种不可能存在的也要进行异常处理:当输入不合法时输出0
2、每月的第一周和最后一周 般都不完整;例如第一周可能没有周一,周二,最后一周可能没有周六,周日;在这种异常情况下,要求输出第一周的周一,显然不存在,这个时候需要按照异常处理,输出0。
3、设定2000年1月1日为周六;为了简化题目,测试用例的年份均大于2000年,年份的取值范围为2000~9999
4、另:闰年2月份是29天;闰年:被4整除且不能被100整除的年份,或者能被400整除的年份为闰年。
输入描述:
输入为任意的年月周周几输入格式为:
YYYY空格MM空格W空格D

说明:YYYY表示年,空格表示空格符,MMm表示月份(01~12),W表示第几周(1~9),D表示周几(1~7,分别表示周一,周二,周三.周日)例如:
2018 02 3 1表示为2018年2月第三周的周一2018 02 8 1表示2018年2月第八周的周一
输出描述:
输出为正常的日期格式YYYY-MM-DD

说明:
YYYY表示年,MM表示月,DD表示日
如上述输入描述例子对应的输出分别为2018-02-12

输入 
2018 02 3 1
输出
2018-02-12

import java.util.*;

public class t1 {
    static int[] year=new int[]{31,28,31,30,31,30,31,31,30,31,30,31};
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int year=sc.nextInt();
        int month=sc.nextInt();
        int week=sc.nextInt();
        int t=sc.nextInt();
        int res=CaculateDay(year,month,week,t);
        if(res==0)
            System.out.println(0);
        else
            System.out.println(year+"-"+String.format("%02d",month)+"-"+String.format("%02d",res));

    }
    public static int CaculateDay(int yy,int mm,int w,int n){
        if(yy>9999||yy<2000)
            return 0;
        if(mm<1||mm>12)
            return 0;
        if(w<1||w>6)
            return 0;
        if(n<1||n>7)
            return 0;
        int res=CaculateWeekDay(yy,mm);
        //System.out.println(res);
        if(w==1&&n<res){
            return 0;
        }
        int d=7-res+1+(w-2)*7+n;
        return d;
    }
    public static int CaculateWeekDay(int yy,int mm){
        //计算每年的第一天是周几,公元1年是周一,计算现在与公元一年相差的天数,闰年要额外+1
        int res=((yy-1)/4-(yy/100)+(yy/400)+(yy-1)*365)%7+1;
        //System.out.println(res);
        //计算每年的mm月的第一天是周几
        int day=0;
        for(int i=0;i<mm-1;i++){
            day+=year[i];
        }
        if(mm>2&&isLeapyear(yy)==1)
            day++;
        res=(res+day%7)%7;
        //System.out.println(res);
        return res;
    }
    public static int isLeapyear(int o){
        if((o%400!=0&&o%4==0)||o%400==0)
            return 1;
        return 0;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值