Java 日期相关操作

1、Date类:java.util.Date

Date的每一个实例用于表示一个时间点,内部维护一个long值,该值记录的是自1970年1月1日00:00:00到当前Date表示的时间之间所经过的毫秒。

注意:如果计算1970年1月1日00:00:00之前的时间戳,那么该值为负值,可通过负值正常计算即可。

由于Date存在时区以及千年虫问题,所以大部分操作时间的方法都被声明为过时的不再建议使用了。

package date;

import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {
        //默认创建表示当前系统时间
        Date date = new Date();
        System.out.println(date);    //Thu Aug 20 10:27:16 CST 2020
        //获取Date内部维护的long值
        long time = date.getTime();
        System.out.println(time);     //1597890475765
        
        time = time+1000*60*60*24;    //加一天
        date.setTime(time);
        System.out.println(date);     //Fri Aug 21 10:29:20 CST 2020
        
        date.setTime(0);
        //默认是1970年1月1日00:00:00,因为东八区的原因所以增加8小时)
        System.out.println(date);     //Thu Jan 01 08:00:00 CST 1970
        
    }
}

2、SimpleDateFormat:java.text.SimpleDateFormat

该类可以将Date与String之间互转。依靠的是一个日期格式字符串。

package date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo2 {
    public static void main(String[] args) throws ParseException {
        Date now = new Date();
        System.out.println(now);    //Thu Aug 20 13:39:44 CST 2020
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        /*
         * String format(Date date)
         * 将给定的Date按照SDF指定的日期格式转换为一个字符串
         */
        String line = sdf.format(now);
        System.out.println(line);    //2020-08-20 13:39:44
        
        /*
         * 将一个字符创解析为一个Date
         */
        String str = "2008-08-08 08:08:08";
        Date date = sdf.parse(str);
        System.out.println(date);
    }
}

3、Calendar日历类:java.util.Calendar

Calendar是用来操作时间的API,使用非常的方便。但本身是一个抽象类,提供一个用于获取实现类的静态方法:getInstance(),该方法可以根据当前系统所在地区获取一个适用的实现类大部分地区获取回来的都是:GregorianCalendar(阳历)

package date;

import java.util.Calendar;
import java.util.Date;

public class CalendarDemo {
    public static void main(String[] args) {
        //Calendar默认也表示当前系统时间
        Calendar calendar = Calendar.getInstance();
        /*
         * Calendar的toString输出的信息很多
         * 但是不能直观的看出具体日期
         */
        System.out.println(calendar);
        /*
         * Date getTime()
         * Calendar提供的getTime方法可以获取一个Date,
         * 该实例表示的就是当前Calendar过表示的日期
         */
        Date date = calendar.getTime();
        System.out.println(date);
        /*
         * Calendar另一个方法:
         * void setTime(Date date)
         * 该方法可以让当前Calendar表示给定的Date
         * 所表示的日期
         */
        calendar.setTime(date);
        System.out.println(calendar);
    }
}

外汇经纪商对比https://www.fx61.com/brokerlist

Calendar提供了获取各时间分量信息的方法:int get(int field)

参数为一个int值,不同的值表示不同的时间分量,而我们无需记忆这些数字,Calendar把这些数定义为了常量。

package date;

import java.util.Calendar;

public class CalendarDemo2 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        //获取年
        int year = calendar.get(Calendar.YEAR);
        //获取月(月从0开始)
        int month = calendar.get(Calendar.MONTH)+1;
        /*
         * 获取日
         * DAY_OF_MONTH 月中的天
         * DATE         月中的天
         * DAY_OF_WEEK  周中的天 
         * DAY_OF_YEAR  年中的天
         */
        int date = calendar.get(Calendar.DATE);
        
        System.out.println(year+"-"+month+"-"+date);
        
        int h = calendar.get(Calendar.HOUR_OF_DAY);
        int m = calendar.get(Calendar.MINUTE);
        int s = calendar.get(Calendar.SECOND);
        System.out.println(h+":"+m+":"+s);
        
        //查看今天是今年的第几天?
        int days = calendar.get(Calendar.DAY_OF_YEAR);
        System.out.println(days);
        
        //今天是周几?
        int dow = calendar.get(Calendar.DAY_OF_WEEK);
        String[] data = {"日","一","二","三","四","五","六"};
        System.out.println("周"+data[dow-1]);
        
        /*
         * 获取指定的时间分量所允许的最大值
         */
        days = calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
        System.out.println(days);    
    }
}

void set(int field,int value)

对指定的时间分量设置指定的值。

package date;

import java.util.Calendar;

/**
 * void set(int field,int value)
 * 对指定的时间分量设置指定的值
 * @author ta
 *
 */
public class CalendarDemo3 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        /*
         * 表示2008-08-08 20:08:08
         */
        calendar.set(Calendar.YEAR, 2008);
        calendar.set(Calendar.MONTH, Calendar.AUGUST);
        calendar.set(Calendar.DATE,3);
        calendar.set(Calendar.HOUR_OF_DAY, 20);
        calendar.set(Calendar.MINUTE, 8);
        calendar.set(Calendar.SECOND, 8);
        //下面的getTime输出如果注释掉,后面的输出结果不同
        System.out.println(calendar.getTime());
        /*
         * 上面设置日期为8号,但是set方法并非在每次
         * 设置后就真的将时间分量该对对应值,而是在
         * getTime时进行实际计算,但是下面的代码在
         * 设置星期几时会影响月中的天,这会导致刚才
         * 设置的8号被覆盖等于没做。
         * 对此的解决办法是,当设置出现相互影响时,
         * 可以在之前设置过后主动调用一次getTime方法
         * 让Calendar进行一次调整运算后再设置就没有
         * 问题了
         */
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println(calendar.getTime());
    }
}

void add(int field,int amount)

对指定的时间分量累加给定值。若给定值为复数则是减去。

该操作与set不同,调用一次后就会真实进行一次计算操作。

package date;

import java.util.Calendar;

/**
 * void add(int field,int amount)
 * 对指定的时间分量累加给定值。若给定的值为
 * 负数则是减去。
 * 该操作与set不同,调用一次后就会真实进行一次
 * 计算操作。
 * @author ta
 *
 */
public class CalendarDemo4 {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        /*
         * 3年5个月零25天以后是哪天?
         */
        //加3年
        calendar.add(Calendar.YEAR, 3);
        //加5个月
        calendar.add(Calendar.MONTH, 5);
        //加25天
        calendar.add(Calendar.DAY_OF_YEAR, 25);
        System.out.println(calendar.getTime());
        /*
         * 查看当周的周六是哪天?
         */
        calendar.set(
            Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        System.out.println(calendar.getTime());
    }
}

你可能感兴趣的:(java)