日期与格式化
日期类
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)
- LocalDate 本地日期
- LocalTime 本地时间
- LocatDateTime 日期+时间的对象
- DateTimeFormatter 专门用来格式化日期时间的对象以及将日期字符串解析为日期对象
- 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);
}
}
- 提供了大量的方法,用于修改日期时间的各个部分,并返回一个新的实例
- 是线程安全的。不仅没有 setter 方法,而且任何对实例的变更都会返回一个新的实例,保证原来的实例不变。
- 通过静态方法 :now()(获取的时间是系统当前的时间)
- 通过静态方法: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));
}
}
- 使用getInstance或getNumberInstance获取正常的数字格式。
- 使用getIntegerInstance得到的整数格式。
- 使用getCurrencyInstance来获取货币数字格式。
- 使用getPercentInstance获取显示百分比的格式。
- DecimalFormat
是NumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(123),定点数(123.4),科学记数法(1.23E4),百分比(12%)和货币金额(123美元)。所有这些都可以本地化。- 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。