Java高级.String
标签(空格分隔): Java
String的使用
String类的概述与不可变性
-
String:字符串,使用一对""引用来表示
1.String声明为final,不可被继承
2.String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[] value用于储存字符串数据(不可修改)
4.String:代表不可变的字符序列。简称:不可变性。
体现:1.当字符串重新赋值时,需要重新指定内存区域,不能使用原有的value进行赋值
2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
3.当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值
5:通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
6:字符串常量池中不会储存相同内容的字符串的package newday3; import org.junit.Test; @Test public void test1(){ String s1 = "abc";//字面量的定义方式 String s2 = "abc"; // s1 = "hello"; System.out.println(s1 == s2);//比较s1与s2的地址值 System.out.println(s1);//hello System.out.println(s2);//abc System.out.println("********************"); String s3 = "abc"; s3 += "def"; System.out.println(s3); System.out.println(s2); System.out.println("********************"); String s4 = "abc"; String s5 = s4.replace('a','m'); System.out.println(s4); System.out.println(s5); } }
面试题
public class StringTest{
String str = new String(original:"good");
char[] ch = {'t', 'e', 's', 't'};
public void change(String str, char ch[]){
str = "test ok";
ch[0] = 'b';
}
public static void main(String[] args){
StringTest ex = new StringTest();
ex.change( ex.str, ex.ch);
System.out.println(ex.str);//good
System.out.println(ex.ch);//best
String的实例化方式
方式一:通过字面量定义的方式
方法二:通过new + 构造器的方式
面试题
String s = new String("ABC");方式创建对象,在内存中创建了几个对象?
答:两个:一个是对空间中new结构,另一个是char[]对应的常量池中的数据:"ABC"。
package newday3;
import org.junit.Test;
/*
* String的使用
* */
public class StringTest {
/*
*String的实例化
* */
@Test
public void test2(){
//通过自变量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
String s1 = "javaEE";
String s2 = "javaEE";
//通过new + 构造器的方式:此时的s3 和 s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3 = new String("javaEE");
String s4 = new String("javaEE");
System.out.println(s1 == s2);//true--常量池
System.out.println(s1 == s3);//false(s1->常量池;s3->堆空间中的地址(堆空间中的地址——>常量池)
System.out.println(s1 == s4);//false
System.out.println(s3 == s4);//false
}
}
String不同拼接操作的对比
-
结论
1、常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
2、只要其中有一个是变量,结果就在堆中
3、如果拼接的结果调用intern()方法,返回值就在常量池中package newday3; import org.junit.Test; /* * String的使用 * */ public class StringTest { @Test public void test3(){ String s1 = "javaEE"; String s2 = "hadoop"; String s3 = "javaEEhadoop"; String s4 = "javaEE" + "hadoop"; String s5 = s1 + "hadoop";//有变量参与的相当于new String s6 = "javaEE" + s2; String s7 = s1 + s2; System.out.println(s3 == s4);//true System.out.println(s3 == s5);//false System.out.println(s3 == s6);//false System.out.println(s3 == s7);//false System.out.println(s5 == s6);//false System.out.println(s5 == s7);//false System.out.println(s6 == s7);//false String s8 = s5.intern();//返回值得到的s8使用的常量值已经存在的"javaEEhadoop" System.out.println(s3 == s8);//true } }
一个拼接问题
public class StringTest {
@Test
public void test4(){
String s1 = "javaEEhadoop";
String s2 = "javaEE";
String s3 = s2 + "hadoop";
System.out.println(s1 == s3);//false
final String s4 = "javaEE";//s4常量(final将其放入了常量池)
String s5 = s4 + "hadoop";
System.out.println(s1 == s5);//true
}
}
String中常用的方法
int length():返回字符串的长度: return value.length
char charAt(int index): 返回某索引处的字符return value[index]
boolean isEmpty():判断是否是空字符串:return value.length == 0
String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
String trim():返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大
小写
String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回一个新的字符串,它是此字符串的从
beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字
符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
package newday3;
import org.junit.Test;
import java.util.Locale;
public class StringMethodTest {
@Test
public void test2(){
String s1 = "HelloWorld";
String s2 = "helloworld";
System.out.println(s1.equals(s2));
System.out.println(s1.equalsIgnoreCase(s2));
String s3 = "abc";
String s4 = s3.concat("def");
System.out.println(s4);
String s5 = "abc";
String s6 = new String("abd");
System.out.println(s5.compareTo(s6));//涉及字符串排序
String s7 = "北京尚硅谷教育";
String s8 = s7.substring(2);
System.out.println(s7);
System.out.println(s8);
String s9 = s7.substring(2,5);
System.out.println(s9);
}
@Test
public void test1(){
String s1 = "HelloWorld";
System.out.println(s1.length());
System.out.println(s1.charAt(0));
System.out.println(s1.charAt(9));
// System.out.println(s1.charAt(10));//长度为十
// s1 = "";
System.out.println(s1.isEmpty());
String s2 = s1.toLowerCase(Locale.ROOT);
System.out.println(s1);
System.out.println(s2);
String s3 = " he llo world ";
String s4 = s3.trim();
System.out.println("------"+ s3 + "-------");
System.out.println("------"+ s4 + "-------");
}
}
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的
子字符串是否以指定前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列
时,返回 true
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出
现处的索引,从指定的索引开始
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后
一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
String replace(char oldChar, char newChar):返回一个新的字符串,它是
通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement):使
用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement) : 使 用 给 定 的
replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此
字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
String与基本数据类型转换
String<--->基本数据类型、包装类
String--->基本数据类型、包装类:调用#### 包装类的静态方法:parseXxx(str)
基本数据类型、包装类--->String:调用String重载的valueOf(xxx)
public class StringTest1 {
@Test
public void test1(){
String str1 = "123";
// int num = (int)str1;//错误的
System.out.println(Integer.parseInt(str1));
int num = Integer.parseInt(str1);
String str2 = String.valueOf(num);
System.out.println(str2);
// String str3 = str2 + "abc";
// System.out.println(str3);
String str3 = str2 + "";
System.out.println(str3 == str1);//false(str1在方法区里,str3在堆里
}
}
String<--->字符串
String ----> char[]调用Strig的toCharArray()
char[]--->String调用String构造器
public class StringTest1 {
@Test
public void test2(){
String str1 = "abcdef";
//String ----> char[]调用Strig的toCharArray()
char[] charArray = str1.toCharArray();
for (int i = 0; i < charArray.length; i++) {
System.out.println(charArray[i]);
}
//char[]--->String调用String构造器
char[] arr = new char[]{'h','e','l','l','o'};
String str2 = new String(arr);
System.out.println(str2);
}
}
String<--->byte[]之间的转换
编码:字符串--->字节(看得懂-->看不懂的二进制)
解码:编码的逆过程:字节-->字符串
String ----> byte[]调用Strig的getBytes()
byte[]----->String调用String的构造器
public class StringTest1 {
@Test
public void test3(){
String str1 = "abc123中国";
byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码
System.out.println(Arrays.toString(bytes));
System.out.println("--------");
String str2 = new String(bytes);//使用默认的字符集,进行解码
System.out.println(str2);
//为了防止出现乱码,编码集与解码集需要保持一致
}
}
StringBuffer类和StringBuilder类
String、StringBuffer、StringBuilder三者的异同?
String:不可变的字符序列:底层结构使用char[]
StringBuffer:可变的字符序列:线程安全的,效率低,底层结构使用char[]
StringBulder:可变的字符序列:jdk5.0新增的,线程不安全的,效率高,底层结构使用char[]
StringBuffer的常用方法:
StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
StringBuffer delete(int start,int end):删除指定位置的内容 //左闭右开
StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str StringBuffer insert(int offset, xxx):在指定位置插入xxx
StringBuffer reverse() :把当前字符序列逆转
public int indexOf(String str)
public String substring(int start,int end) 返回一个从start开始到end索引结束的左闭右开的子字符串
public int length()
public char charAt(int n )
public void setCharAt(int n ,char ch)
public class StringBufferBuilderTest {
@Test
public void test1(){
StringBuffer s1 = new StringBuffer("abc");
s1.append(1);
s1.append("1");
System.out.println(s1);
// s1.delete(2,4);
// System.out.println(s1);
//
// s1.replace(2,4,"hello");
// System.out.println(s1);
//
// s1.insert(2,"true");
// System.out.println(s1);
s1.reverse();
System.out.println(s1);
}
}
对比String、StringBuffer、StringBuilder三者效率对比
从高到低排序:StringBuilder > StringBuffer > String
获取时间
public class DateTimeTest {
//1.System类中的currentTimeMillis()
@Test
public void test1(){
long time = System.currentTimeMillis();
//返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差
//称为时间戳
System.out.println(time);
}
}
Java中Date类的使用
-
Java.util.Date类
---Java.sql.Date类 -
- 两个构造器的使用
》构造器一:Date():创建一个对应当前时间的Date对象
》构造器二:创建指定毫秒数的Data对象
- 两个构造器的使用
-
- 两个方法的使用
》toString():显示当前的年、月、日、时、分、秒
》getTime():获取当前Date对象对应的毫秒数。(时间戳)
- 两个方法的使用
-
- Java.sql.Date对应着数据库中的日期类型的变量
public class DateTimeTest {
@Test public void test2(){ //构造器一:Date():创建一个对应当前时间的Date对象 Date date1 = new Date(); System.out.println(date1.toString());//Thu Sep 15 18:40:53 CST 2022 System.out.println(date1.getTime());//1663238453068 //构造器二:创建指定毫秒数的Date对象 Date date2 = new Date(1663238453068L); System.out.println(date2.toString()); //创建java.sql.Date对象 java.sql.Date date3 = new java.sql.Date(35235325345l); System.out.println(date3);//1971-02-13 //如何将java.util.Date对象转化为java.sql.Date对象 //情况一: /*Date date4 = new java.sql.Date(2343232323l); java.sql.Date date5 = (java.sql.Date)date4;*/ //情况二: Date date6 = new Date(); java.sql.Date date7 = new java.sql.Date(date6.getTime()); } }
SimpleDateFormat类
SimpleDateFormat API 简介
SimpleDateFormat
- 一个与语言环境相关的格式化日期和分析日期的工具类。
- 利用该类可以将日期转换成文本,或者将文本转换成日期。
--
在使用SimpleDateFormat时需要指定一个需要的格式(pattern)来格式日期(Date).
在此请注意几个字母大小写的差异:
- 大写的H为24小时制表示一天中的小时数(0-23)
- 小写的h为12小时制表示一天中的小时数(1-12)
- 大写的M表示年中的月份
- 小写的m表示小时中的分钟数
- 大写的S表示毫秒数
- 小写的s表示秒数
- 所以最常用的24小时制的具体日期的pattern为:
- yyyy-MM-dd HH:mm:ss
--
SimpleDateFormat中format()方法小结:
- 1 format()方法的作用是将日期(Date)转换为文本
- 2 format()方法的输入参数是一个Date
--
SimpleDateFormat中parse()方法小结:
- 1 parse()方法的作用是将文本转换为日期(Date)
- 2 parse()方法的输入参数是一个文本,比如String
1. 将日期转换为文本
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String time = simpleDateFormat.format(date);
System.out.println("----> 格式化后的日期为: "+time);
System.out.println("----------------------------------");
--
System.out: ----> 格式化后的日期为: 2019-05-23 22:28:01
System.out: ----------------------------------
2. 将文本转换为日期
/**
* 请注意:
*
* 文本的格式应该与 SimpleDateFormat 中的 pattern 保持一致,否则导致异常
* 比如:
* 2008年08月18日 20:07:33 对应于yyyy年MM月dd日 HH:mm:ss
* 2008-08-18 20:07:33 对应于yyyy-MM-dd HH:mm:ss
*/
private void test2() {
try {
String day = "2008年08月18日 20:07:33";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.getDefault());
Date date = simpleDateFormat.parse(day);
System.out.println("----> 格式化后的日期为: "+date);
day = "2008-08-18 20:07:33";
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
date = simpleDateFormat.parse(day);
System.out.println("----> 格式化后的日期为: "+date);
day = "20131227085009";
simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault());
date = simpleDateFormat.parse(day);
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
String time = simpleDateFormat.format(date);
System.out.println("----> 时间文本为: "+time);
System.out.println("----------------------------------");
} catch (Exception e) {
System.out.println("----> Exception: "+e.toString());
}
}
--
System.out: ----> 格式化后的日期为: Mon Aug 18 20:07:33 GMT+08:00 2008
System.out: ----> 格式化后的日期为: Mon Aug 18 20:07:33 GMT+08:00 2008
System.out: ----> 时间文本为: 2013-12-27 08:50:09
3. 将时间戳转换成时间
long timeStamp=System.currentTimeMillis();//获取当前时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Date date = new Date(timeStamp);//将时间强制转换成时间戳
String time = simpleDateFormat.format(date);
System.out.println("----> 将时间戳转换为字符串: "+time);
System.out.println("----------------------------------");
--
System.out: ----> 将时间戳转换为字符串: 2019-05-23 22:36:27
4. 将时间转换成时间戳
long timeStamp = System.currentTimeMillis();//获取当前时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Date date = new Date(timeStamp);
String time = simpleDateFormat.format(date);
System.out.println("----> 当前时间戳为: "+timeStamp+" ,其字符串为:"+time);
Date parsedDate = simpleDateFormat.parse(time);
long ts = parsedDate.getTime();
System.out.println("----> 将字符串转换为时间戳: "+ts);
System.out.println("----------------------------------");
--
----> 当前时间戳为: 1558622317494 ,其字符串为:2019-05-23 22:38:37
----> 将字符串转换为时间戳: 1558622317000
5. java时间戳与unix时间戳的关系
/**
* java中生成的时间戳精确到毫秒,但unix中精确到秒
* 所以两者相差1000倍
*/
long javaTimeStamp = System.currentTimeMillis();
long unixTimeStamp = javaTimeStamp/1000;
System.out.println("----> java时间戳: " + javaTimeStamp+", unix时间戳:" + unixTimeStamp);
System.out.println("----------------------------------");
--
此处输入代码System.out: ----> java时间戳: 1558622474893 ,unix时间戳:1558622474
6. 计算两个时间的差值
private String time1="2016-01-02 00:00:00";
private String time2="2013-09-21 00:00:00";
private void getTimeDifference(String time1,String time2) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
try {
Date date1 = simpleDateFormat.parse(time1);
Date date2 = simpleDateFormat.parse(time2);
long difference = date1.getTime() - date2.getTime();
long days = difference / (1000 * 60 * 60 * 24);
System.out.println("----> 两个时间相距:"+days+"天");
} catch (Exception e) {
System.out.println("----> Exception="+e.toString());
}
System.out.println("----------------------------------");
}
--
System.out: ----> 两个时间相距:833天
7. 比较两个时间的大小
private void compareTime(String time1, String time2) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
Calendar calendar1 = java.util.Calendar.getInstance();
Calendar calendar2 = java.util.Calendar.getInstance();
try {
calendar1.setTime(dateFormat.parse(time1));
calendar2.setTime(dateFormat.parse(time2));
} catch (java.text.ParseException e) {
System.out.println("----> Exception=" + e.toString());
}
int result = calendar1.compareTo(calendar2);
if (result == 0){
System.out.println("----> time1等于time2");
}else if (result < 0) {
System.out.println("----> time1小于time2");
}else {
System.out.println("----> time1大于time2");
}
}
--
System.out: ----> time1大于time2
2. 线程安全的使用方法
2.1 ThreadLocal
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ConcurrentDateUtil {
private static ThreadLocal<DateFormat> threadLocal = new ThreadLocal<DateFormat>() {
@Override
protected DateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
public static Date parse(String dateStr) throws ParseException {
return threadLocal.get().parse(dateStr);
}
public static String format(Date date) {
return threadLocal.get().format(date);
}
}
使用 ThreadLocal, 也是将共享变量变为独享,线程独享肯定能比方法独享在并发环境中能减少不少创建对象的开销。如果对性能要求比较高的情况下,一般推荐使用这种方法。
2.2 Java 8 中的解决办法
Java 8 提供了新的日期时间 API,其中包括用于日期时间格式化的 DateTimeFormatter,它与 SimpleDateFormat 最大的区别在于:DateTimeFormatter 是线程安全的,而 SimpleDateFormat 并不是线程安全。
解析日期
String dateStr= "2018年06月20日";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
LocalDate date= LocalDate.parse(dateStr, formatter);
日期转换为字符串
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm a");
String nowStr = now.format(format);
参考链接
https://blog.csdn.net/u011033906/article/details/90489803?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166347288616782248521877%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166347288616782248521877&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-90489803-null-null.142v47pc_rank_34_1,201v3add_ask&utm_term=simpledateformat&spm=1018.2226.3001.4187
Calendar日历类(抽象类)的使用
-
实例化
方法一:创建其子类(GregorianCalendar)的对象
方法二:调用其静态方法getInstance() -
常用方法
get();
set();
add();
getTime();
setTime();@Test public void testCalendar(){ //1. 实例化 //方法一:创建其子类(GregorianCalendar)的对象 //方法二:调用其静态方法getInstance() Calendar calendar = Calendar.getInstance();//当前的时间 // System.out.println(calendar.getClass()); //get() int days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); System.out.println(calendar.get(Calendar.DAY_OF_YEAR)); //set() calendar.set(Calendar.DAY_OF_MONTH,13); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //add() calendar.add(Calendar.DAY_OF_MONTH,-4); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //getTime():日历类--->Date Date date = calendar.getTime(); System.out.println(date); //setTime():Date--->日历类 Date date1 = new Date(); calendar.setTime(date1); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); }
LocalDate、LocalTime、LocalDateTime的使用
说明:
1、 LocalDateTime相较于LocalDate、LocalTime的使用频率更高
2、 LocalDate、LocalTime、LocalDateTime类似于Calendar
package newday3;
import org.junit.Test;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class JDK8DateTest {
@Test
public void test1(){
//now():获取当前的日期、时间、日期+时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
//of():设置指定的年、月、日、时、分、秒,是没有偏移量的
LocalDateTime localDateTime1 = LocalDateTime.of(2022, 9, 13, 9, 45);
System.out.println(localDateTime1);
//getXxx()得到相关的属性
System.out.println(localDateTime.getDayOfMonth());
System.out.println(localDate.getDayOfMonth());
System.out.println(localTime.getHour());
System.out.println(localDateTime.getDayOfWeek());
//Local具有不可变性,原有的不变,只是新增,使用具体看你调用哪一个
//withXxxXxx()设置相关属性
LocalDate localDate1 = localDate.withDayOfMonth(22);
System.out.println(localDate);//2022-09-24
System.out.println(localDate1);//2022-09-22
System.out.println(localDate);//2022-09-24
//plusXxx() 加
LocalDateTime localDateTime2 = localDateTime.plusMonths(3);
System.out.println(localDateTime);
System.out.println(localDateTime2);
//minusXxx() 减
LocalDateTime localDateTime3 = localDateTime.minusDays(7);
System.out.println(localDateTime);
System.out.println(localDateTime3);
}
}
瞬时 Instant
//Instant的使用
//类似于java,util.date类
@Test
public void test2(){
//now():获取本初子午线对应的标准时间
Instant instant = Instant.now();
System.out.println(instant);//2022-09-24T01:50:07.033443400Z
//Xxxxx.atOffset(ZoneOffset.ofHours(XXX)):添加时间的偏移量
OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);//2022-09-24T09:51:55.192586700+08:00
//toEpochMilli():获取自1970年1月1日0时0分0秒(UTC)开始的毫秒数
long milli = instant.toEpochMilli();
System.out.println(milli);
//ofEpochMilli():通过给定的毫秒数,获取Instant实例 --->Date(long millis)
Instant ofEpochMilli = Instant.ofEpochMilli(1663984618515l);
System.out.println(ofEpochMilli);
}
DateTimeFormatter
DateTimeFormatter:格式化或解析日期、时间 类似于SimplDateFormat
java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法: 预定义的标准格式。如:
方式一:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
方式二:本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
@Test
public void test3(){
//方式一:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期--->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
System.out.println(localDateTime);
System.out.println(str1);//2022-09-24T10:25:17.227
//解析:字符串--->日期
TemporalAccessor parse = formatter.parse(str1);
System.out.println(parse);
//方式二:本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)//LONG\SHORT....只在输出的格式上不同,本质内容相同
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
String str2 = formatter1.format(localDateTime);
System.out.println(str2);//2022/9/24 上午10:34
//方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”)
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
//格式化
String str4 = dateTimeFormatter.format(LocalDateTime.now());
System.out.println(str4);
}
jdk8中时间的其它API
ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12- 03T10:15:30+01:00
Europe/Paris。 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如: Asia/Shanghai等
Clock:使用时区提供对当前即时、日期和时间的访问的时钟。 持续时间:Duration,用于计算两个“时间”间隔
日期间隔:Period,用于计算两个“日期”间隔 TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整
到“下一个工作日”等操作。 TemporalAdjusters : 该类通过静态方法
(firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用 TemporalAdjuster
的实现。