Java常见的系统类——日期与格式化

日期类

JDK1.8之前(Date和Calendar)

因为jdk1.8版本之前的时间类存在线程安全问题,所以大多方法不再使用
使用这两种类都要先导入包:import java.util.*;

Date类

以代码为例

public class TestDate {
	public static void main(String[] args) throws ParseException {
		// 获取当时时间
		Date date = new Date();
		
		System.out.println(date);
//		System.out.println(date.getYear());
//		System.out.println(date.getMonth() + 1);
//		System.out.println(date.getDate());
		// 以上Date对象提供获取时间的常见方法全都已经过时了,因此不建议大家这样使用了
		
		// 获取当前时间的时间戳, 1970-01-01 00:00:00 距离当前的毫秒数
//		System.out.println(date.getTime());
		
		// java还可以通过System类获取时间戳,可以获取当前时间戳
//		System.out.println(System.currentTimeMillis());
		
		// 日期对象 --->  字符串  格式化时间
//		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
		String format = sdf.format(date);
		System.out.println(format);
		
		// 字符串 ---> 日期对象		
		String strTime = "2018年10月8日 12:12:12";
		DateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		Date date2 = sdf2.parse(strTime);
		System.out.println(date2);
		
		
		
	}
}

1.SimpleDateFormat是格式化时间的类,(“yyyy-MM-dd HH:mm:ss”)里面写的是格式
使用format方法格式成字符串
2.parse方法是将字符串转化为日期对象的方法
3.Date获取年是从1900开始的到现在的时间间隔,获取的是一个数字而非具体年份

Calendar类

以代码为例

public class TestCalendar {
	
	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance(); 
		
		int year = calendar.get(Calendar.YEAR);
		int month = calendar.get(Calendar.MONTH) + 1;//从0开始的所以+1
		int day = calendar.get(Calendar.DATE);
		int hour = calendar.get(Calendar.HOUR);
		int minute = calendar.get(Calendar.MINUTE);
		int s = calendar.get(Calendar.SECOND);
		System.out.println(year +"-"+ month +"-"+ day + " "+ hour +":"+ minute +":"+s);
		
	}
}

1.由于Calendar是抽象基类,所以不能用new的方式实现,只能用它的getInstance()方法。
2.Calendar类在获取年月日的方面较Date 更加方便
3.一个Calendar的实例是系统时间的抽象表示,通过get(Calendar.xxx)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY
、MINUTE、SECOND

JDK1.8(新的时间API)

  1. LocalDate 本地日期
  2. LocalTime 本地时间
  3. LocatDateTime 日期+时间的对象
  4. DateTimeFormatter 专门用来格式化日期时间的对象以及将日期字符串解析为日期对象
  5. Instant 伦敦标准时间,就是经度为0的,0时区时间

以代码为例


import java.time.*;
import java.time.format.DateTimeFormatter;
public class ccv {
	public static void main(String[] args) {
		LocalDate localDate = LocalDate.now();
		System.out.println(localDate);
		System.out.println(localDate.getDayOfMonth());
		System.out.println(localDate.getDayOfYear());		

		LocalTime localTime = LocalTime.now();
		System.out.println(localTime);
		
		LocalDateTime dateTime = LocalDateTime.now();
		System.out.println(dateTime);
		
		String str = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
		System.out.println(str);
		
		LocalDateTime ldt = LocalDateTime.parse("2000年03月08日 14:52:18", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"));
		System.out.println(ldt);
		
		Instant instant = Instant.now();
		System.out.println(instant);						
	}
}
  1. 提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例
  2. 是线程安全的。不仅没有 setter 方法,而且任何对实例的变更都会返回一个新的实例,保证原来的实例不变。
  3. 通过静态方法 :now()(获取的时间是系统当前的时间)
  4. 通过静态方法:of()(方法参数可以指定时间)
标题比较常用的与获取相关的方法

getYear():获取年
getHour():获取小时
getMinute():获取分钟
getSecond():获取秒值
getDayOfMonth():获得月份天数(1-31)
getDayOfYear():获得年份天数(1-366)
getDayOfWeek():获得星期几(返回一个 DayOfWeek枚举值)
getMonth():获得月份(返回一个 Month 枚举值)
getMonthValue():获得月份(1-12)
getYear():获得年份

格式化(format)

1.BigDecimal

以代码为例在这里插入图片描述
直接输出0.1+0.2会出现0.30000004这种情况,因为浮点数在执行时会损失精度,所以我们会用到BigDecimal来实现高精度运算

	BigDecimal bigDecimal1 = new BigDecimal("0.1");//创建一个BigDecimal型数据,值为0.1
	BigDecimal bigDecimal2 = new BigDecimal("0.2");
	
	BigDecimal add = bigDecimal1.add(bigDecimal2);//BigDecimal的加法
	System.out.println(add);
	
	System.out.println(bigDecimal1.subtract(bigDecimal2));//BigDecimal的减法
	System.out.println(bigDecimal1.divide(bigDecimal2));//BigDecimal的除法
	System.out.println(bigDecimal1.multiply(bigDecimal2))//BigDecimal的乘法

代码结果
在这里插入图片描述BigDecimal属于大数据,精度极高,不属于基本数据类型,属于java对象(引用数据类型)
这是SUN提供的一个类,专门用在财务软件上

NumberFormat

帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点,千位分隔符的区域设置约定,甚至是使用的特定十进制数字,或者数字格式是否为十进制。

public class TestNumberFormat {	
	@Test
	public void test01() {
		NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
		System.out.println(currencyInstance.format(12345));
	}
	
	@Test
	public void test02() {
		System.out.println(NumberFormat.getCurrencyInstance(Locale.US).format(12345));
		System.out.println(NumberFormat.getCurrencyInstance(Locale.UK).format(12345));
	}
	
	// 千分位分隔符
	@Test
	public void test03() {
		System.out.println(NumberFormat.getNumberInstance().format(1235.63941));
	}
	
	@Test
	public void test04() {
		System.out.println(NumberFormat.getPercentInstance().format(56.2378));
	}

	@Test
	public void test05() {
		double num = 23465.1264566;
		// # 主要是在.之后,表示要保留的小数位
		DecimalFormat df = new DecimalFormat("0.0000");
		String format = df.format(num);
		System.out.println(format);
		
		DecimalFormat df2 = new DecimalFormat("0E0");
		System.out.println(df2.format(num));
	}
	
	@Test
	void test06() {
		double pi = 3.1415927;
		System.out.println(new DecimalFormat("0").format(pi));

		System.out.println(new DecimalFormat("0.00").format(pi));
		//取两位整数和三位小数,整数不足部分以0填补。
		System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
		//取所有整数部分
		System.out.println(new DecimalFormat("#").format(pi));
		//以百分比方式计数,并取两位小数
		System.out.println(new DecimalFormat("#.##%").format(pi));
		long c = 299792458;
		System.out.println(new DecimalFormat("#.#####E0").format(c));// 2.99792E8
		System.out.println(new DecimalFormat("00.####E0").format(c));// 29.9792E7

		System.out.println(new DecimalFormat(",###").format(c));// 299,792,458

		System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c));
	}

}
  1. 使用getInstance或getNumberInstance获取正常的数字格式。
  2. 使用getIntegerInstance得到的整数格式。
  3. 使用getCurrencyInstance来获取货币数字格式。
  4. 使用getPercentInstance获取显示百分比的格式。
  5. DecimalFormat
    是NumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(123),定点数(123.4),科学记数法(1.23E4),百分比(12%)和货币金额(123美元)。所有这些都可以本地化。
  6. DecimalFormat的一些方法
    在这里插入图片描述

面试题

== 和 equals 的区别是什么?

String x = "string";
String y = "string";
String z = new String("string");
System. out. println(x==y); // true
System. out. println(x==z); // false
System. out. println(x. equals(y)); // true
System. out. println(x. equals(z)); // true

因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String() 方法则重写开辟了内存空间,所以 == 结果为
false,而 equals 比较的一直是值,所以结果都为 true。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值