目录
学习内容:
延伸:
mysql中TIMESTAMPDIFF:
语法:
TIMESTAMPDIFF(unit,begin,end); 根据单位返回时间差,对于传入的begin和end不需要相同的数据结构,可以存在一个为Date一个DateTime
单位:
-
MICROSECOND(微秒)
-
SECOND(秒)
-
MINUTE
-
HOUR
-
DAY
-
WEEK
-
MONTH
-
QUARTER
-
YEAR
例子:
·直接计算
SELECT TIMESTAMPDIFF(MONTH, '2017-01-01', '2017-02-01') as result;
SELECT TIMESTAMPDIFF(SECOND, '2017-01-01 08:00:00',
'2017-01-01 08:55:33') result;
MICROSECOND(微秒)、MINUTE、HOUR、DAY、WEEK、QUARTER、YEAR同理
·求数据表中的两个字段
准备
CREATE TABLE demo (id INT AUTO_INCREMENT PRIMARY KEY, start_time DATE NOT NULL,
end_time DATE NOT NULL);
Query OK, 0 rows affected (0.10 sec)
INSERT INTO demo(start_time, end_time)
VALUES('1983-01-01', '1990-01-01'),
('1983-01-01', '1989-06-06'),
('1983-01-01', '1985-03-02'),
('1983-01-01', '1992-05-05'),
('1983-01-01 11:12:11', '1995-12-01');
select * from demo;
select *, TIMESTAMPDIFF(YEAR, start_time, end_time) as duration from demo;
· 其他应用
select *, if(TIMESTAMPDIFF(YEAR, end_time,
CURRENT_TIMESTAMP())< 26 ,'< 26','>= 26') as result from demo;
SQL中的if语句:
IF(condition, expr1 , expr2 )
condition的值为 TRUE,则返回值为 expr1,condition的值为FALSE,则返回值为 expr2
SQL中的CURRENT_TIMESTAMP():
CURRENT_TIMESTAMP:记录自动添加记录创建的时间
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP:自动添加本次更改时间
日期和时间:
前言:
注意到计算机内存除了二进制的0
/1
外没有其他任何格式。上述十六机制是为了简化表示。当我们用System.out.println(n);打印这个整数的时候,实际上println(n)这个方法在内部把int类型转换成String
类型,然后打印出字符串123400.
类似的,我们也可以以十六进制的形式打印这个整数,或者,如果n
表示一个价格,我们就以$123,400.00
的形式来打印它:
public class test {
public static void main(String[] args) {
int n = 123400;
// 123400
System.out.println(n);
// 1e208
System.out.println(Integer.toHexString(n));
// $123,400.00
System.out.println(NumberFormat.getCurrencyInstance(Locale.US).format(n));
}
}
时间戳(Epoch Time):
Epoch Time是计算从1970年1月1日零点(格林威治时区/GMT+00:00)到现在所经历的秒数,在计算机中,只需要存储一个整数1574208900
表示某一时刻。当需要显示为某一地区的当地时间时,我们就把它格式化为一个字符串:
String displayDateTime(int n, String timezone) { ... }
要获取当前时间戳,可以使用System.currentTimeMillis()
,这是Java程序获取时间戳最常用的方法。
Date:
java.util.Date
是用于表示一个日期和时间的对象,注意与java.sql.Date
区分,后者用在数据库中。如果观察Date的源码,可以发现它实际上存储了一个long类型的以毫秒表示的时间戳
基本用法:
Date date = new Date();
System.out.println(date.getYear()+1900); // 必须加上1900
System.out.println(date.getMonth() + 1); // 0~11,必须加上1
System.out.println(date.getDate()); // 1~31,不能加1
// 转换为String:
System.out.println(date.toString());
// 转换为GMT时区:
System.out.println(date.toGMTString());
// 转换为本地时区:
System.out.println(date.toLocaleString());
SimpleDateFormat:
定义:
日期和时间格式由 日期和时间模式字符串 指定。在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串。
方法:
parse方法:将字符串类型(java.lang.String)解析为日期类型(java.util.Date)
format方法:将日期类型(Date)数据格式化为字符串(String)
Date date1 = new Date();
System.out.println("直接输出"+date1);
System.out.println("时间戳"+date1.getTime());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=sdf.format(date1.getTime());
System.out.println("格式化:"+time);
String str="2021-08-30 17:13:15";
date1=sdf.parse(str);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd, yyyy");
System.out.println("方法使用后:" +simpleDateFormat.format(date1));
输出结果:
使用不同字母个数,日期输出不一样,详情见 JDK文档,以M举例:
M:输出9
MM:输出09
MMM:输出Sep
MMMM:输出September
Calendar:
Calendar
可以用于获取并设置年、月、日、时、分、秒,它和Date
比,主要多了一个可以做简单的日期和时间运算的功能。
基本用法:
Calendar c = Calendar.getInstance();
int y = c.get(Calendar.YEAR);
int m = 1 + c.get(Calendar.MONTH); // 0~11->1月~12月
int d = c.get(Calendar.DAY_OF_MONTH);
int w = c.get(Calendar.DAY_OF_WEEK); // 1~7->周日~周六
int hh = c.get(Calendar.HOUR_OF_DAY);
int mm = c.get(Calendar.MINUTE);
int ss = c.get(Calendar.SECOND);
int ms = c.get(Calendar.MILLISECOND);
System.out.println(y + "-" + m + "-" + d + " " + w + " " + hh +
":" + mm + ":" + ss + "." + ms);
//2021-8-30 2 17:39:18.595
Calendar
只有一种方式获取,即Calendar.getInstance()
,而且一获取到就是当前时间。如果我们想给它设置成特定的一个日期和时间,就必须先清除所有字段:
// 当前时间:
Calendar calendar = Calendar.getInstance();
// 清除所有:
calendar.clear();
// 设置2021年:
calendar.set(Calendar.YEAR, 2021);
// 设置8月:注意7表示8月:
calendar.set(Calendar.MONTH, 7);
// 设置31日:
calendar.set(Calendar.DATE, 31);
// 设置时间:
calendar.set(Calendar.HOUR_OF_DAY, 18);
calendar.set(Calendar.MINUTE, 01);
calendar.set(Calendar.SECOND, 23);
System.out.println(new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss").format(calendar.getTime()));
// 2021-08-31 18:01:23
利用Calendar.getTime()
可以将一个Calendar
对象转换成Date
对象,然后就可以用SimpleDateFormat
进行格式化了。
TimeZone:
Calendar
和Date
相比,它提供了时区转换的功能。时区用TimeZone
对象表示:
TimeZone tzDefault = TimeZone.getDefault(); // 当前时区
TimeZone tzGMT9 = TimeZone.getTimeZone("GMT+09:00"); // GMT+9:00时区
TimeZone tzNY = TimeZone.getTimeZone("America/New_York"); // 纽约时区
// 当前时间:
Calendar calendar2 = Calendar.getInstance();
// 清除所有:
calendar2.clear();
// 设置为北京时区:
calendar2.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
// 设置年月日时分秒:
calendar2.set(2021, 10 /* 11月 */, 11, 18, 13, 13);
// 显示时间:
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf2.setTimeZone(TimeZone.getTimeZone("America/New_York"));
System.out.println(sdf2.format(calendar2.getTime()));
//2021-11-11 05:13:13
利用Calendar
进行时区转换的步骤是:
-
清除所有字段;
-
设定指定时区;
-
设定日期和时间;
-
创建
SimpleDateFormat
并设定目标时区; -
格式化获取的
Date
对象(注意Date
对象无时区信息,时区信息存储在SimpleDateFormat
中)。
日期之间的运算:
calendar.add(Calendar.DAY_OF_MONTH, n)
n:正数往后推,负数往前提
// 当前时间:
Calendar calendar3 = Calendar.getInstance();
// 清除所有:
calendar3.clear();
// 设置年月日时分秒:
calendar3.set(2021, 10 /* 11月 */, 11, 18, 13, 13);
// 加5天并减去2小时:
calendar3.add(Calendar.DAY_OF_MONTH, 5);
calendar3.add(Calendar.HOUR_OF_DAY, -2);
// 显示时间:
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date3 = calendar3.getTime();
System.out.println(sdf.format(date3));
// 2021-11-16 16:13:13
LintCode刷题:
·final变量不可变
创建新的User对象,建立一个方法可以把字符串变量赋值给这个User对象。
public class Solution {
final User user= new User();
public User getUser(String str){
user.setName(str);
return user;
}
}
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
·用拼接的方式打印字符串
字符串的拼接用+或者用concat()方法
public class Solution {
public String splice(String name, String phone) {
return name+": "+phone;
// return name.concat(": "+phone);
}
}
·四舍五入
建立个方法可把单个int数字四舍五入,要做整数的四舍五入得先/10,因为Math.rounds方法只能四舍五入第一位小数。
* "/"int型除法会舍去小数部分,所以有两种方法来实现
public class Solution {
public int[] rounding(int[] array) {
for (int i=0;i<array.length;i++){
array[i]=rounding(array[i]);
}
return array;
}
public int rounding(int num){
float n=0;
if (num>0) {
n=(float) num/10; // n=(num+5)/10;
num=Math.round(n); // num=(int)n;
return num*10;
}
else
return num;
}
}
根据个位数的大小来进行判断,大于等于五时去个位十位进一,小于五时,去个位即可
public class Solution {
public int[] rounding(int[] array) {
for (int i = 0; i < array.length; i++) {
if (array[i] > 0) {
if (array[i] % 10 >= 5)
array[i] = array[i] + 10 - array[i] % 10;
else
array[i]=array[i]-array[i]%10;
}else
array[i]=array[i];
}
return array;
}
}
·对私有变量的调用
set方法把name赋值给student即可
public class Student {
private String name;
int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
public class Solution {
public void print(String name, int age) {
Student student = new Student();
student.setName(name);
student.age=age;
System.out.println(student.getName());
System.out.println(student.age);
}
}
·这天是星期几
延伸->Date和Calendar
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Solution {
public String dateConversion(String str) throws ParseException {
String week[] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd");
Date parse =simpleDateFormat.parse(str);
Calendar calendar =Calendar.getInstance();
calendar.setTime(parse);
int index =calendar.get(Calendar.DAY_OF_WEEK);
return week[index-1];
}
}
·计算课程表创建与指定日期相差的年数
延伸->SQL中的(TIMESTAMPDIF)
SELECT `name` AS `courses_name` ,`created_at` AS `courses_created_at`,
TIMESTAMPDIFF(YEAR, `created_at`, '2021-04-01') AS `year_diff`
FROM `courses`;
学习时间:
2021-8-28 0:00-3:00、16:00-18:00、20:00-22:00
2021-8-29 0:00-3:00、19:00-21:45
学习产出:
刷题*6
学习博客*1