程序员成长之路(Day 20、21)

目录

学习内容:

延伸:

mysql中TIMESTAMPDIFF:

        语法:

        单位:

        例子:

·直接计算

 ·求数据表中的两个字段

· 其他应用

        SQL中的if语句:

        SQL中的CURRENT_TIMESTAMP():

日期和时间:

        前言:

         时间戳(Epoch Time):

        Date:

基本用法:

        SimpleDateFormat:

        定义:

        方法:

        Calendar:

基本用法:

TimeZone:

 日期之间的运算:

LintCode刷题:

·final变量不可变

·用拼接的方式打印字符串

·四舍五入

·对私有变量的调用

 ·这天是星期几

 ·计算课程表创建与指定日期相差的年数

学习产出:


学习内容:

延伸:

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:

         CalendarDate相比,它提供了时区转换的功能。时区用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进行时区转换的步骤是:

  1. 清除所有字段;

  2. 设定指定时区;

  3. 设定日期和时间;

  4. 创建SimpleDateFormat并设定目标时区;

  5. 格式化获取的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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值