Java教程

Java基础-日期、正则

本文主要是介绍Java基础-日期、正则,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、Date类

  1、Date类概述(参考博客:http://www.cnblogs.com/V1haoge/p/7126930.html)

  Date类是从JDK1.1就开始存在的老类,其提供了针对日期进行操作的诸多方法,但其却一直饱受诟病,不同的起始编号,国际化的低支持,JDK官方也认识到这个问题,后台提出使用Calendar类进行日期操作,日期的格式化交给DateFormat,虽然我们已经不再使用Date类中的大多数方法,但是还有一部分保留的内容指的我们一谈。

  2、构造器

  Date类之前有6大构造器,其中四个已经标注弃用,我们我不再看他,我们重点看另外两个:

      

  第一个构造器是无参构造器,通过调用System的currentTimeMillis()方法来获取当前时间戳,这个时间戳是从1970年到当前时间的毫秒级数据,第二个构造器,可以将一个毫秒级的数据定义为Date格式的日期。

  3、常用方法

  Date中定义了诸多的日期操作方法,但是大多数都已弃用,只剩余为数不多的几个方法:

    long getTime()方法:返回从1970年00:00:00到Date对象所代表时间的毫秒级数据。

    void setTime(long time)方法:设置一个Date对象用来代表从1970年00:00:00开始的一段毫秒级数据后所代表的时间点。

    boolean before(Date when)方法:判断Date对象所代表的时间点是否在when所代表的时间点之前。

    boolean after(Date when)方法:判断Date对象所代表的时间点是否在when所代表的时间点之后。

public static void main(String[] args) {
        Date now = new Date();//获取当前时间
        Date when = new Date(10201020097865L);//根据时间戳定义指定时间点
        boolean b1 = now.after(when);
        boolean b2 = now.before(when);
        Long d1 = now.getTime();
        Long d2 = when.getTime();

        System.out.println("now值为:"+now);
        System.out.println("when值为:"+when);
        System.out.println("b1值为:"+b1);
        System.out.println("b2值为:"+b2);
        System.out.println("d1值为:"+d1);
        System.out.println("d2值为:"+d2);
}
结果:
now值为:Sun Feb 13 17:30:40 CST 2022
when值为:Tue Apr 04 16:41:37 CST 2293
b1值为:false
b2值为:true
d1值为:1644744640747
d2值为:10201020097865

  4、Date类实现了java.io.Serializable接口,可以执行序列化与反序列化操作。

  在Date类中定义了writeObject(ObjectOutputStream s)方法和readObject(ObjectInputStream s)方法,分别用于在Date对象进行序列化和反序列化操作时将对象所代表的时间戳(long型数据)进行保存与获取,因为fastTime字段采用transient修饰,其内容会被序列化机制过滤掉,而这个字段内保存的是Date对象所代表时间的时间戳(long型)。

  总结:

  Date类现在并不推荐使用,Java推荐了Calendar和DateFormat,甚至SimpleDateFormat来替代它,Date中仅剩的几个方法仍然还很实用,尤其是before与after方法,可以很方便的判断两个时间点的先后,当然判断的条件是将你的时间转换成Date格式,使用Date剩余的两个构造器实现即可,当然也可以使用推荐的SimpleDateFormat方法进行简单的格式化日期格式字符串的方式得到Date格式的时间点。

二、calendar类

  Calendar概述:

  Calendar类的功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。而且在实现方式上也比Date类要简单一些。

  Java官方推荐使用Calendar来替换Date的使用,Calendar与Date之间可以自由的进行转换,转换的纽带是time,使用Calendar的getTime()方法可以得到一个Date类型的对象。

  通过Calendar的setTime(Date date)方法可以将一个Date对象转换为一个Calendar对象,这个方法以一个Date对象为参数,底层调用的setTimeInMillis(long millis)方法。

  1、Calendar类对象的创建

    Calendar类是一个抽象类,由于Calendar类是抽象类,且Calendar类的构造方法是protected的,所以无法使用Calendar类的构造方法来创建对象,API中提供了getInstance方法用来创建对象。

  创建一个代表系统当前日期的Calendar对象:

Calendar c = Calendar.getInstance();  //返回当前时间

 

  2、创建一个指定日期的Calendar对象

 

  使用Calendar类代表特定的时间,需要首先创建一个Calendar的对象,然后再设定该对象中的年月日参数来完成。

//创建一个代表2014年5月9日的Calendar对象
  Calendar c1 = Calendar.getInstance();
  c1.set(2022, 5 - 1, 9);//调用:public final void set(int year,int month,int date)

  3、Calendar类对象信息的设置与获得

  1)Calendar类对象信息的设置

   A、Set设置

       调用:public final void set(int year,int month,int date)

 c1.set(2014, 6- 1, 9);//把Calendar对象c1的年月日分别设这为:2014、6、9

     B、利用字段类型设置

   如果只设定某个字段,例如日期的值,则可以使用public void set(int field,int value)

//把 c1对象代表的日期设置为10号,其它所有的数值会被重新计算
     c1.set(Calendar.DATE,10);
//把c1对象代表的年份设置为2014年,其他的所有数值会被重新计算
     c1.set(Calendar.YEAR,2015);

   其他字段属性set的意义以此类推

Calendar类中用一下这些常量表示不同的意义,jdk内的很多类其实都是采用的这种思想
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——星期几

   C、Add设置(可用与计算时间)

//把c1对象的日期加上10,也就是c1所表的日期的10天后的日期,其它所有的数值会被重新计算
    c1.add(Calendar.DATE, 10);
//把c1对象的日期加上-10,也就是c1所表的日期的10天前的日期,其它所有的数值会被重新计算
    c1.add(Calendar.DATE, -10);

   其他字段属性的add的意义以此类推

  2)Calendar类对象信息的获得(使用get())

 Calendar c1 = Calendar.getInstance();
// 获得年份
int year = c1.get(Calendar.YEAR);
// 获得月份
int month = c1.get(Calendar.MONTH) + 1;(MONTH+1)
// 获得日期
int date = c1.get(Calendar.DATE);
// 获得小时
int hour = c1.get(Calendar.HOUR_OF_DAY);
// 获得分钟
int minute = c1.get(Calendar.MINUTE);
// 获得秒
int second = c1.get(Calendar.SECOND);
// 获得星期几(注意(这个与Date类是不同的):1代表星期日、2代表星期1、3代表星期二,以此类推)
int day = c1.get(Calendar.DAY_OF_WEEK);

三、 GregorianCalendar类

  GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家使用的标准日历系统。

  1、GregorianCalendar类对象的创建

  GregorianCalendar有自己的构造方法,而其父类Calendar没有公开的构造方法。

  // 在具有默认语言环境的默认时区内使用当前时间构造一个默认的 GregorianCalendar。  
  GregorianCalendar()

  //在具有默认语言环境的默认时区内构造一个带有给定日期设置的 GregorianCalendar。
  GregorianCalendar(int year, int month, int dayOfMonth) 
  GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) 。
  GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)

  2、创建一个代表当前日期的GregorianCalendar对象

  GregorianCalendar gc = new GregorianCalendar();
  //创建一个代表2022年6月19日的GregorianCalendar对象(注意参数设置,与其父类是一样,月份要减去1)
  GregorianCalendar gc = new GregorianCalendar(2022,6-1,19);

  3、另外:GregorianCalendar有一个方法:boolean isLeapYear(int year) 确定给定的年份是否为闰年

 

四、DateFormat类和SimpleDateFormat类

  DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat类)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。我们通过这个类可以帮我们完成日期和文本之间的转换。

  DateFormat 可帮助进行格式化并解析任何语言环境的日期。对于月、星期,甚至日历格式(阴历和阳历),其代码可完全与语言环境的约定无关。

  要格式化一个当前语言环境下的日期也就是日期 -> 文本),要通过下面的方法来完成。DateFormat是抽象类,我们需要使用其子类SimpleDateFormat来创建对象。

//创建日期格式化对象,在获取格式化对象时可以指定风格
DateFormat df= new SimpleDateFormat("yyyy-MM-dd");//对日期进行格式化
Date date = new Date(1607616000000L);
String str_time = df.format(date);
System.out.println(str_time);//2020年12月11日

  DateFormat类的作用:即可以将一个Date对象转换为一个符合指定格式的字符串,也可以将一个符合指定格式的字符串转为一个Date对象。

  指定格式的具体规则我们可参照SimpleDateFormat类的说明,这里做简单介绍,规则是在一个字符串中,会将以下字母替换成对应时间组成部分,剩余内容原样输出:

  当出现y时,会将y替换成年

  当出现M时,会将M替换成月

  当出现d时,会将d替换成日

  当出现H时,会将H替换成时

  当出现m时,会将m替换成分

  当出现s时,会将s替换成秒

 

  DateFormat类的常用方法:

  format方法,用来将Date对象转换成String。

  parse方法,用来将String转换成Date(转换时,该String要符合指定格式,否则不能转换)。

//把Date对象转换成String
     Date date = new Date(1607616000000L);//Fri Dec 11 00:00:00 CST 2020
    DateFormat df = new SimpleDateFormat(“yyyy年MM月dd日”);
    String str = df.format(date);
    //str中的内容为2020年12月11日

//把String转换成Date对象
    String str = ”2020年12月11日”;
    DateFormat df = new SimpleDateFormat(“yyyy年MM月dd日”);
    Date date = df.parse( str );
    //Date对象中的内容为Fri Dec 11 00:00:00 CST 2020

 五、正则表达式

  正则表达式(英语:Regular Expression,在代码中常简写为regex)。

  正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。

  在Pattern类中有正则表达式的的规则定义,正则表达式中明确区分大小写字母。
  正则表达式的语法规则:

字符:x
含义:代表的是字符x
例如:匹配规则为 "a",那么需要匹配的字符串内容就是 ”a”

字符:\\
含义:代表的是反斜线字符'\'
例如:匹配规则为"\\" ,那么需要匹配的字符串内容就是 ”\”

字符:\t
含义:制表符
例如:匹配规则为"\t" ,那么对应的效果就是产生一个制表符的空间

字符:\n
含义:换行符
例如:匹配规则为"\n",那么对应的效果就是换行,光标在原有位置的下一行

字符:\r
含义:回车符
例如:匹配规则为"\r" ,那么对应的效果就是回车后的效果,光标来到下一行行首

字符类:[abc]
含义:代表的是字符a、b 或 c
例如:匹配规则为"[abc]" ,那么需要匹配的内容就是字符a,或者字符b,或字符c的一个

字符类:[^abc]
含义:代表的是除了 a、b 或 c以外的任何字符
例如:匹配规则为"[^abc]",那么需要匹配的内容就是不是字符a,或者不是字符b,或不是字符c的任意一个字符

字符类:[a-zA-Z]
含义:代表的是a 到 z 或 A 到 Z,两头的字母包括在内
例如:匹配规则为"[a-zA-Z]",那么需要匹配的是一个大写或者小写字母

字符类:[0-9]
含义:代表的是 0到9数字,两头的数字包括在内
例如:匹配规则为"[0-9]",那么需要匹配的是一个数字

字符类:[a-zA-Z_0-9]
含义:代表的字母或者数字或者下划线(即单词字符)
例如:匹配规则为" [a-zA-Z_0-9] ",那么需要匹配的是一个字母或者是一个数字或一个下滑线

预定义字符类:.
含义:代表的是任何字符
例如:匹配规则为" . ",那么需要匹配的是一个任意字符。如果,就想使用 . 的话,使用匹配规则"\\."来实现

预定义字符类:\d
含义:代表的是 0到9数字,两头的数字包括在内,相当于[0-9]
例如:匹配规则为"\d ",那么需要匹配的是一个数字

预定义字符类:\w
含义:代表的字母或者数字或者下划线(即单词字符),相当于[a-zA-Z_0-9]
例如:匹配规则为"\w ",,那么需要匹配的是一个字母或者是一个数字或一个下滑线

边界匹配器:^
含义:代表的是行的开头
例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容从[abc]这个位置开始, 相当于左双引号

边界匹配器:$
含义:代表的是行的结尾
例如:匹配规则为^[abc][0-9]$ ,那么需要匹配的内容以[0-9]这个结束, 相当于右双引号

边界匹配器:\b
含义:代表的是单词边界
例如:匹配规则为"\b[abc]\b" ,那么代表的是字母a或b或c的左右两边需要的是非单词字符([a-zA-Z_0-9])

数量词:X?
含义:代表的是X出现一次或一次也没有
例如:匹配规则为"a?",那么需要匹配的内容是一个字符a,或者一个a都没有

数量词:X*
含义:代表的是X出现零次或多次
例如:匹配规则为"a*" ,那么需要匹配的内容是多个字符a,或者一个a都没有

数量词:X+
含义:代表的是X出现一次或多次
例如:匹配规则为"a+",那么需要匹配的内容是多个字符a,或者一个a

数量词:X{n}
含义:代表的是X出现恰好 n 次
例如:匹配规则为"a{5}",那么需要匹配的内容是5个字符a

数量词:X{n,}
含义:代表的是X出现至少 n 次
例如:匹配规则为"a{5, }",那么需要匹配的内容是最少有5个字符a

数量词:X{n,m}
含义:代表的是X出现至少 n 次,但是不超过 m 次
例如:匹配规则为"a{5,8}",那么需要匹配的内容是有5个字符a 到 8个字符a之间

   字符串中涉及到的正则表达式方法:

public boolean matches(String regex) //判断字符串是否匹配给定的规则

举例:校验qq号码.

1: 要求必须是5-15位数字

2: 0不能开头

代码演示:
String qq = "604154942";
String regex = "[1-9][0-9]{4,14}";
boolean flag2 = qq.matches(regex);

举例:校验手机号码

1:要求为11位数字

2:第1位为1,第2位为3、4、5、7、8中的一个,后面9位为0到9之间的任意数字。

代码演示:
String phone = "18800022116";
String regex = "1[34578][0-9]{9}";
boolean flag = phone.matches(regex);

public String[] split(String regex)  //根据给定正则表达式的匹配规则,拆分此字符串

举例:分割出字符串中的的数字

代码演示:
String s = "18-22-40-65";
String regex = "-";
String[] result = s.split(regex);
代码演示:
String s = "18 22 40 65";
String regex = " ";
String[] result = s.split(regex);

public String replaceAll(String regex,String replacement) //将符合规则的字符串内容,全部替换为新字符串

举例:把文字中的数字替换成*

代码演示:
String s = "Hello12345World6789012";
String regex = "[0-9]";
String result = s.replaceAll(regex, "*");

其他常用正则例子:

匹配正确的数字
匹配规则:
    匹配正整数:”\\d+”
    匹配正小数:”\\d+\\.\\d+”  
    匹配负整数:”-\\d+”
    匹配负小数:”-\\d+\\.\\d+”
    匹配保留两位小数的正数:”\\d+\\.\\d{2}”
    匹配保留1-3位小数的正数:”\\d+\\.\\d{1,3}”

匹配合法的邮箱
匹配规则:
    ”[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+”
    ”\\w+@\\w+(\\.\\w+)+”

获取IP地址(192.168.1.100)中的每段数字
匹配规则:
    ”\\.”

 

 

这篇关于Java基础-日期、正则的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!