zoukankan      html  css  js  c++  java
  • PAT——不吉利的日期(java中date和Calendar使用)

    题目描述

    在国外,每月的 13 号和每周的星期 5 都是不吉利的。特别是当 13 号那天恰好是星期 5时,更不吉利。

    现在给你一个年份,请你从小到大依次输出当年所有13 号是星期 5 的月份。

    输入描述:

    输入包含多组数据,每组数据包含一个正整数year(2000≤year≤9999)。



    输出描述:

    对应每一组数据,输出所有符合条件的月份,月份之间用空格隔开。

    如果当年不存在13号是星期五的月份,就输出一行Luck。

    输入例子:

    2000
    2001
    2002

    输出例子:

    10
    4 7
    9 12

     1 package com.hone.basicaltest;
     2 
     3 import java.text.SimpleDateFormat;
     4 import java.util.Calendar;
     5 import java.util.Locale;
     6 import java.util.Scanner;
     7 
     8 
     9 /**
    10  * 原题目:https://www.nowcoder.com/pat/2/problem/359
    11  * @author Xia
    12  * 找出历史中即是13号又是星期五的日子
    13  */
    14 public class basical1029UnluckDay {
    15     public static void main(String[] args) {
    16         Scanner ss = new Scanner(System.in);
    17         while (ss.hasNextLine()) {
    18             int year = ss.nextInt();
    19             int flag = 0;
    20             for (int i = 0; i <= 11; i++) {
    21                     String[] weeks = {"","sun","mon","tue","wen","thu","fri","sat"};
    22                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
    23                     Calendar cc = Calendar.getInstance();
    24                     cc.set(year, i, 13);
    25                     int w = cc.get(Calendar.DAY_OF_WEEK);
    26                     if (w == 6) {
    27                         if (flag == 0) {
    28                             System.out.print(i+1);
    29                             flag = 1;
    30                         }else {
    31                             System.out.print(" "+(i+1));
    32                         }
    33                     }
    34             }
    35             if (flag == 0) {
    36                 System.out.println("Luck");
    37             }
    38             
    39         }
    40             
    41     }
    42 }

    下面来介绍java中Date以及Calendar的使用:

    Date介绍

    在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。

    1、使用Date类代表当前系统时间

    1 Date d = new Date();
    3 System.out.println(d);

    使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,显示的结果如下:

    但是遗憾的是,Date很多方法都已经被遗弃,现在主要使用功能更强大的Calendar类。


    Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。
    由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象
    Calendar rightNow = Calendar.getInstance();            //用于获取当前实例化的时间
    Calendar.getInstance();   并没有主动继承显示日期的toString()方法,无法直接打印rightNow来获得日期。

    具有两个构造方法(都是protected修饰)

    ModifierConstructor and Description
    protected Calendar()
    Constructs a Calendar with the default time zone and the default FORMAT locale.
    protected Calendar(TimeZone zone, Locale aLocale)
    Constructs a calendar with the specified time zone and locale.





    常见的方法:

    1:设置日期
    void set(int year, int month, int date)
    Sets the values for the calendar fields YEARMONTH, and DAY_OF_MONTH.
    
    
    1 Calendar d2 = Calendar.getInstance(Locale.CHINA);
    2 d2.set(2017, 10, 11);        //表示2017、11、11

    注意:年份的数值直接书写,月份的值为实际的月份值减1,日期的值就是实际的日期值。

    只设定某一个字段的日期:
    void set(int field, int value)
    Sets the given calendar field to the given value.
    Calendar d2 = Calendar.getInstance(Locale.CHINA);
    d2.set(Calendar.YEAR, 2016);
    d2.set(Calendar.MONTH, 10);
    d2.set(Calendar.DAY_OF_MONTH, 11);        //d2 : 2016/11/11

    设置中常见的属性:

    Calendar.YEAR——年份
    Calendar.MONTH——月份
    Calendar.DATE——日期
    Calendar.DAY_OF_MONTH——日期,和上面的字段完全相同
    Calendar.HOUR——12小时制的小时数
    Calendar.HOUR_OF_DAY——24小时制的小时数
    Calendar.MINUTE——分钟
    Calendar.SECOND——秒
    Calendar.DAY_OF_WEEK——星期几

    2:获取日期

    1 Calendar d2 = Calendar.getInstance(Locale.CHINA);
    2 d2.set(Calendar.YEAR, 2016);
    3 d2.set(Calendar.MONTH, 10);
    4 d2.set(Calendar.DAY_OF_MONTH, 11);
    5 System.out.println(d2.get(Calendar.YEAR)+"/"+(d2.get(Calendar.MONTH)+1)+"/"+d2.get(Calendar.DAY_OF_MONTH))
    //年份
    int year = d2.get(Calendar.YEAR);
    //月份
    int month = d2.get(Calendar.MONTH) + 1;
    //日期
    int date = d2.get(Calendar.DATE);
    //小时
    int hour = d2.get(Calendar.HOUR_OF_DAY);
    //分钟
    int minute = d2.get(Calendar.MINUTE);
    //秒
    int second =d2.get(Calendar.SECOND);

    3:改变日期

    abstract void add(int field, int amount)
    Adds or subtracts the specified amount of time to the given calendar field, based on the calendar's rules.
    
    
    1 Calendar d2 = Calendar.getInstance(Locale.CHINA);
    2 d2.set(Calendar.YEAR, 2016);
    3 d2.set(Calendar.MONTH, 10);
    4 d2.set(Calendar.DAY_OF_MONTH, 11);
    5 d2.add(Calendar.YEAR, -1);         //年份减一
    6 d2.add(Calendar.MONTH, -1);      //月份减一
    7 d2.add(Calendar.DATE, 1);        //日期加一          最终输出   2015/10/12
    8 System.out.println(d2.get(Calendar.YEAR)+"/"+(d2.get(Calendar.MONTH)+1)+"/"+d2.get(Calendar.DAY_OF_MONTH));  
    4:比较日期

    boolean after(Object when)
    Returns whether this Calendar represents a time after the time represented by the specifiedObject.
    boolean before(Object when)
    Returns whether this Calendar represents a time before the time represented by the specified Object.
    
    
    Calendar d = Calendar.getInstance();        //得到当前日期
    Calendar d2 = Calendar.getInstance(Locale.CHINA);
    d2.set(Calendar.YEAR, 2016);
    d2.set(Calendar.MONTH, 10);
    d2.set(Calendar.DAY_OF_MONTH, 11);
    System.out.println(d.after(d2));        //true

    5:Calendar对象和Date对象相互转化

    首先将Calendar对象转化为Date

    Calendar d = Calendar.getInstance();        //得到当前日期   (当前日期为:2017/11/30)
    System.out.println(d);      //java.util.GregorianCalendar[time=1512040754905.........
    Date date  = d.getTime();
    System.out.println(date);    //Thu Nov 30 19:19:14 CST 2017

    将Date对象转化为Calendar

    1 Date d3 = new Date();
    2 System.out.println(d3);            //Thu Nov 30 19:24:40 CST 2017
    3 Calendar c = Calendar.getInstance();
    4 c.setTime(d3);
    5 System.out.println(c);            //java.util.GregorianCalendar[time=1512041080861....
    6   

    举例:计算小明出生到今天一共有多少天?

    假设:小明是2000、10、1出生

     1 import java.util.Calendar;
     2 /**
     3  * 计算小明出生到现在一共多少天?
     4  * @author Xia
     5  */
     6 public class calendarDay {
     7     public static void main(String[] args) {
     8         Calendar c = Calendar.getInstance();
     9         Calendar c2 = Calendar.getInstance();
    10         c2.set(2000, 10-1, 1);
    11         //全部转化为相对时间
    12         long birth = c2.getTimeInMillis();            //按照毫秒为单位
    13         long today = c.getTimeInMillis();
    14         
    15         long day = (today-birth)/(24*60*60*1000);
    16         System.out.println(day);
    17     }
    18 }

    更多的内容请参见jdk1.8或者其他版本的API

  • 相关阅读:
    Java守护线程Daemon
    在for循环中创建双向链表
    Java泛型-官方教程
    大自然搬运工
    转 curl命令
    HashMap扩容问题及了解散列均分
    mysql 分组查询并取出各个分组中时间最新的数据
    CNN 模型复杂度分析
    Attention机制
    深度学习之目标检测
  • 原文地址:https://www.cnblogs.com/xiaxj/p/7929341.html
Copyright © 2011-2022 走看看