Xử lý Ngày tháng và Mảng trong Java - Các phương thức cơ bản

1. Phương thức làm việc với Ngày tháng

1. Lớp Date

Lấy ngày giờ hiện tại và số mili giây tương ứng

public class LopDateTest {
    /*
        Lớp Date
     */
    @Test
    public void kiemTraDate(){

        /*
            Gói: java.util.Date
         */
        Date ngayHienTai = new Date();//Lấy ngày giờ hiện tại
        System.out.println(ngayHienTai);

        //Lấy số mili giây hiện tại
        long soMiliGiay = ngayHienTai.getTime();//Số mili giây - 1712888846161   Fri Apr 12 10:27:26 CST 2024
        System.out.println(soMiliGiay);


        Date ngayTuMiliGiay = new Date(1712888846161L);//Lấy ngày giờ từ số mili giay
        System.out.println(ngayTuMiliGiay);
    }

    /*
        SimpleDateFormat : Định dạng ngày giờ theo yêu cầu
     */
    @Test
    public void kiemTraFormat() throws ParseException {
        //Truyền định dạng vào constructor
        SimpleDateFormat dinhDangNgay = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //Chuyển ngày giờ thành chuỗi (theo định dạng đã chọn)
        String chuoiNgay = dinhDangNgay.format(new Date());
        System.out.println(chuoiNgay);

        //2024-04-12 10:34:06
        //Chuyển chuỗi thành Date
        //Lưu ý: Định dạng chuỗi phải khớp với định dạng trong constructor
        Date ngay = dinhDangNgay.parse("2024-04-12 10:34:06");
        System.out.println(ngay);
    }
}

2. LocalDate, LocalTime, LocalDateTime

package com.vietpro.java;

import org.junit.Test;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Month;

/*
    LocalDate : Ngày
    LocalTime : Thời gian
    LocalDateTime : Ngày và thời gian
 */
public class LopDateTimeTest {
    @Test
    public void kiemTra(){

        LocalDate ngayHienTai = LocalDate.now(); //Ngày hiện tại
        LocalTime thoiGianHienTai = LocalTime.now(); //Thời gian hiện tại
        LocalDateTime ngayGioHienTai = LocalDateTime.now();//Ngày và thời gian hiện tại

        System.out.println(ngayHienTai);
        System.out.println(thoiGianHienTai);
        System.out.println(ngayGioHienTai);


        System.out.println("===============================================");

        //Tạo đối tượng ngày chỉ định
        LocalDate ngayChiDinh = LocalDate.of(2022, 10, 10);
        System.out.println(ngayChiDinh);

        //Tạo đối tượng thời gian chỉ định
        LocalTime thoiGianChiDinh = LocalTime.of(12, 10, 10, 200);
        System.out.println(thoiGianChiDinh);

    }

    @Test
    public void kiemTra2(){

        LocalDateTime hienTai = LocalDateTime.now();

        //Ngày trong tháng hiện tại
        int ngayTrongThang = hienTai.getDayOfMonth();
        //Lấy tháng hiện tại
        Month thang = hienTai.getMonth();

        System.out.println(ngayTrongThang);
        System.out.println(thang);

        System.out.println("------------------------------------");

        //Cộng 1 ngày vào ngày hiện tại --- Không sửa ngày gốc (tạo ngày mới)
        LocalDateTime ngayMoi = hienTai.plusDays(1);
        System.out.println(ngayMoi);

        //Cộng 2 ngày vào ngày hiện tại --- Không sửa ngày gốc (tạo ngày mới)
        LocalDateTime ngayMoi2 = hienTai.plusDays(2);
        System.out.println(ngayMoi2);

    }

    @Test
    public void kiemTra3(){
        /*
        | isBefore()/isAfter() | So sánh hai LocalDate |
        isLeapYear()       | Kiểm tra năm nhuận (được khai báo trong lớp LocalDate) |
         */
        LocalDate hienTai = LocalDate.now();
        System.out.println(hienTai.getYear() + " : " + (hienTai.isLeapYear()? "Là năm nhuận" : "Là năm thường"));

        System.out.println("------------------------------------");

        LocalDate ngay1 = LocalDate.of(2022, 10, 3);
        LocalDate ngay2 = LocalDate.of(2021, 8, 9);

        System.out.println(ngay1.isAfter(ngay2));

    }
}

3. SimpleDateFormat và DateTimeFormatter

package com.vietpro.java;

import org.junit.Test;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;

/*
 DateTimeFormatter : Định dạng ngày giờ - Định dạng để có được định dạng mong muốn
 */
public class LopDateTimeFormatterTest {

    @Test
    public void kiemTra(){
        //Lấy ngày giờ hiện tại
        LocalDateTime hienTai = LocalDateTime.now();

        //Cách chuyển đổi thứ nhất
        DateTimeFormatter dinhDang = DateTimeFormatter.ISO_DATE;
        String chuoi = dinhDang.format(hienTai);//Định dạng ngày giờ
        System.out.println(chuoi);


        System.out.println("==================================");
        //Cách chuyển đổi thứ hai
        DateTimeFormatter dinhDang2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
        String chuoi2 = dinhDang2.format(hienTai);//Định dạng ngày giờ
        System.out.println(chuoi2);


        System.out.println("==================================");
        //Cách chuyển đổi thứ ba : Tùy chỉnh
        DateTimeFormatter dinhDang3 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        //Chuyển ngày giờ thành chuỗi
        String chuoi3 = dinhDang3.format(hienTai);
        //Chuyển chuỗi thành ngày giờ
        TemporalAccessor doiTuongNgay = dinhDang3.parse("2024-04-12 14:58:58");
        System.out.println(chuoi3);
    }
}

2. Công cụ làm việc với Mảng

1. Lớp tiện ích

package com.vietpro.java2;

import org.junit.Test;

import java.util.Arrays;

/*
    Lớp tiện ích cho mảng : Arrays
 */
public class LopArraysTest {

    /*
        toString : Ghép các phần tử trong mảng thành một chuỗi
     */
    @Test
    public void kiemTra(){
        int[] mangSo = {1,2,3,4,5};
        //Ghép các phần tử trong mảng thành một chuỗi
        String chuoi = Arrays.toString(mangSo);
        System.out.println(chuoi);
    }
    /*
        sort : Sắp xếp các phần tử trong mảng
     */
    @Test
    public void kiemTra2(){
        int[] mangSo = {5,2,1,3,9};
        // Sắp xếp các phần tử trong mảng : Vì là kiểu tham chiếu nên không cần trả về giá trị
        Arrays.sort(mangSo);

        System.out.println(Arrays.toString(mangSo));
    }
    @Test
    public void kiemTra22(){
        int[] mangSo = {5,2,1,3,9,4,8,6};
        //static void sort(int[] a, int fromIndex, int toIndex) : Sắp xếp phần tử mảng a từ [fromIndex, toIndex) theo thứ tự tăng dần
        //Lưu ý: Không bao gồm toIndex
        Arrays.sort(mangSo,0,3);
        System.out.println(Arrays.toString(mangSo));
    }

    /*
    Tìm nhị phân trong mảng
        static int binarySearch(int[] a, int key)
    Lưu ý: Điều kiện là mảng phải được sắp xếp
     */
    @Test
    public void kiemTra3(){
        int[] mangSo = {5,2,1,3,9,4,8,6,7};
        //Sắp xếp
        Arrays.sort(mangSo);
        System.out.println(Arrays.toString(mangSo));
        //Tìm - Kết quả tìm là vị trí sau khi sắp xếp. Nếu không tìm thấy trả về số âm
        System.out.println(Arrays.binarySearch(mangSo,4));
    }

    /*
     * static int[] copyOf(int[] original, int newLength)  : Tạo một mảng mới có độ dài newLength dựa trên mảng gốc original và trả về mảng mới
     *
     * //Đây là phương thức generic -- Sẽ giải thích sau (Hiểu ở đây T là bất kỳ kiểu dữ liệu nào -- nhưng không phải kiểu dữ liệu nguyên thủy)
     * static <T> T[] copyOf(T[] original,int newLength): Tạo một mảng mới có độ dài newLength dựa trên mảng gốc original và trả về mảng mới
     *
     */
    @Test
    public void kiemTra4(){
        int[] mangSo = {1,2,3};
        //Mở rộng mảng - ①Tạo mảng mới ②Sao chép nội dung từ mảng gốc vào mảng mới
        int[] mangMoi = Arrays.copyOf(mangSo, 6);

        System.out.println(Arrays.toString(mangMoi));

        System.out.println("==========================================");

        String[] chuoiMang = {"aa","bbb"};
        Arrays.copyOf(chuoiMang,20);
    }
    /*
     * static int[] copyOfRange(int[] original, int from, int to) : Tạo mảng mới từ phần tử [from,to) của mảng original và trả về mảng mới
     *      Lưu ý: Không bao gồm vị trí to
     * static <T> T[] copyOfRange(T[] original,int from,int to): Tạo mảng mới từ phần tử [from,to) của mảng original và trả về mảng mới
     */
    @Test
    public void kiemTra5(){
        int[] mangSo = {5,2,1,3,9,4,8,6,7};
        int[] mangSoMoi = Arrays.copyOfRange(mangSo, 0, 3);
        System.out.println(Arrays.toString(mangSoMoi));
    }

    /*
     * static boolean equals(int[] a, int[] a2) : So sánh độ dài và các phần tử của hai mảng có giống nhau không
     *      So sánh nội dung (số lượng phần tử, nội dung phần tử)
     * static boolean equals(Object[] a,Object[] a2): So sánh độ dài và các phần tử của hai mảng có giống nhau không
     */
    @Test
    public void kiemTra6(){
        int[] mangSo = {5,2,1,3,9,4,8,6};
        int[] mangSo2 = {5,2,1,3,9,4,8,5};

        System.out.println(Arrays.equals(mangSo,mangSo2));
    }
    /*
     * static void fill(int[] a, int val) : Điền giá trị val vào toàn bộ mảng a
     * static void fill(Object[] a,Object val): Điền đối tượng val vào toàn bộ mảng a
     * static void fill(int[] a, int fromIndex, int toIndex, int val): Điền giá trị val vào phần [fromIndex,toIndex) của mảng a
     * static void fill(Object[] a, int fromIndex, int toIndex, Object val) : Điền đối tượng val vào phần [fromIndex,toIndex) của mảng a
     */
    @Test
    public void kiemTra7(){
        int[] mangSo = {5,2,1,3,9,4,8,6};
        Arrays.fill(mangSo,100);

        System.out.println(Arrays.toString(mangSo));
    }
}

2. Chèn và xóa phần tử trong mảng

package com.vietpro.java2;

import org.junit.Test;

import java.util.Arrays;

/*
 static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)    :
    src: Mảng nguồn (copy từ mảng nguồn)
    srcPos: Vị trí bắt đầu copy trong mảng nguồn
    dest: Mảng đích (copy nội dung từ mảng nguồn vào mảng đích)
    destPos: Vị trí bắt đầu copy trong mảng đích
    length: Độ dài nội dung cần copy
Copy một mảng từ mảng nguồn, bắt đầu từ vị trí chỉ định, đến vị trí chỉ định trong mảng đích. Thường dùng để chèn và xóa phần tử trong mảng
 */
public class LopSystemArrayTest {
    @Test
    public void kiemTra(){
         int[] mangSo = {1,2,3,4,5,6};
         int[] mangSoMoi = new int[10];
        System.arraycopy(mangSo,2,mangSoMoi,2,3);

        System.out.println(Arrays.toString(mangSoMoi));
    }
}

3. Bài tập thực hành

package com.vietpro.java2;

import java.util.Arrays;

public class LopMangTest {
    public static void main(String[] args) {

        GioHang gioHang = GioHang.getInstance();
        gioHang.themVaoGio("Điện thoại Samsung S23");
        gioHang.themVaoGio("Laptop Dell XPS");
        gioHang.themVaoGio("Tai nghe Sony WH-1000XM4");
        gioHang.themVaoGio("Đồng hồ Apple Watch");
        gioHang.themVaoGio("Máy tính bảng iPad");

        GioHang gioHang2 = GioHang.getInstance();
        gioHang2.xoaSanPham(2);

        GioHang gioHang3 = GioHang.getInstance();
        gioHang3.capNhatSanPham(1,"Tai nghe Sony WH-1000XM5");

        gioHang3.hienThiGioHang();
    }
}

class GioHang{

    //Mảng chứa sản phẩm - String[]
    private String[] gioHang = new String[3];
    private int dem = 0;


    private GioHang(){}

    private final static GioHang instance = new GioHang();

    public static GioHang getInstance(){
        return instance;
    }

    public void themVaoGio(String sanPham){
        //Kiểm tra mảng đã đầy chưa
        if (dem >= gioHang.length){
            //Mảng đầy - Mở rộng
            /*
                Thực hiện 3 việc
                1. Tạo mảng mới có độ dài : Độ dài mảng cũ * 2
                2. Sao chép nội dung từ mảng cũ vào mảng mới
                3. Gán mảng mới cho tham chiếu của mảng cũ
             */
            gioHang = Arrays.copyOf(gioHang,gioHang.length * 2);
        }
        //Thêm sản phẩm vào mảng - Xử lý trường hợp mảng đầy
        gioHang[dem] = sanPham;
        dem++;
    }

    public void xoaSanPham(int viTri){
        //Kiểm tra vị trí có sản phẩm không
        if (viTri >=0 && viTri < dem) {
            //Xóa có phải là sản phẩm cuối cùng không
            if (viTri == dem - 1){
                //Đặt vị trí cuối cùng thành null
                gioHang[dem - 1] = null;
            }else {
                //Xóa sản phẩm khỏi mảng
                System.arraycopy(gioHang, viTri + 1, gioHang, viTri, dem - viTri - 1);
                //Đặt vị trí cuối cùng thành null
                gioHang[dem - 1] = null;
            }
            dem--;//Giảm số lượng sản phẩm đi 1
        }else{//Vị trí không hợp lệ
            throw new ViTriKhongHopLeException("Không có sản phẩm này");
        }
    }

    public void capNhatSanPham(int viTri, String sanPhamMoi){
        //Kiểm tra vị trí có sản phẩm không
        if (viTri >=0 && viTri < dem) {
            //Cập nhật sản phẩm
            gioHang[viTri] = sanPhamMoi;
        }else{
            throw new ViTriKhongHopLeException("Không có sản phẩm này");
        }
    }

    public void hienThiGioHang(){
        if (dem == 0) {
            System.out.println("Giỏ hàng trống");
        }else {
            //Hiển thị tất cả sản phẩm
            for (int i = 0; i < dem; i++) {
                System.out.println(gioHang[i]);
            }
        }
    }

}


class ViTriKhongHopLeException extends RuntimeException {
    public ViTriKhongHopLeException(String message) {
        super(message);
    }
}

4. So sánh phần tử mảng

package com.vietpro.java3;

import java.util.Arrays;

public class LopSoSanhTest {
    public static void main(String[] args) {

        Sach[] sachList = new Sach[4];
        sachList[0] = new Sach("Java căn bản",150000,45);
        sachList[1] = new Sach("Lập trình hướng đối tượng",120000,32);
        sachList[2] = new Sach("Cơ sở dữ liệu",135000,28);
        sachList[3] = new Sach("Mạng máy tính",180000,51);


        sapXep(sachList);


        System.out.println(Arrays.toString(sachList));

    }

    public static void sapXep(Sach[] sachList){
        for (int i = 0; i < sachList.length - 1; i++) {
            for (int j = 0; j < sachList.length - i - 1; j++) {
                if (sachList[j].soSanh(sachList[j + 1]) > 0){
                    Sach temp = sachList[j];
                    sachList[j] = sachList[j+1];
                    sachList[j+1] = temp;
                }
            }
        }
    }
}

/*
    Sắp xếp tự nhiên : Comparable

    Lợi ích :  Không cần sửa thuật toán sắp xếp.
               Muốn sắp xếp đối tượng nào chỉ cần lớp của đối tượng đó triển khai interface Comparable và ghi đè phương thức compareTo
               Trong phương thức compareTo thực hiện cách sắp xếp (sắp xếp theo thuộc tính nào) là được
 */
class Sach implements Comparable{
    String tenSach;
    int gia;

    //Số lượng bán
    int soLuongBan;


    public Sach(String tenSach, int gia, int soLuongBan) {
        this.tenSach = tenSach;
        this.gia = gia;
        this.soLuongBan = soLuongBan;
    }

    @Override
    public String toString() {
        return tenSach + " " + gia + " " + soLuongBan;
    }

    /*
        So sánh nội dung

        Giá trị trả về:
            Số dương: Giá của đối tượng hiện tại lớn hơn giá đối tượng truyền vào
            Số âm: Giá của đối tượng hiện tại nhỏ hơn giá đối tượng truyền vào
            0 : Giá của đối tượng hiện tại bằng giá đối tượng truyền vào
     */
    @Override
    public int compareTo(Object o) {
        if (!(o instanceof Sach) || o == null){
            throw new RuntimeException("Loại không khớp");
        }

        //Ép kiểu xuống
        Sach sachKhac = (Sach) o;

        return this.gia - sachKhac.gia;
//        return this.soLuongBan - sachKhac.soLuongBan;
    }
}

5. Sắp xếp tự nhiên

package com.vietpro.java4;

import java.util.Arrays;
import java.util.Comparator;

public class LopBoSoSanhTest {
    public static void main(String[] args) {

        Sach[] sachList = new Sach[4];
        sachList[0] = new Sach("Java căn bản",150000,45);
        sachList[1] = new Sach("Lập trình hướng đối tượng",120000,32);
        sachList[2] = new Sach("Cơ sở dữ liệu",135000,28);
        sachList[3] = new Sach("Mạng máy tính",180000,51);


        /*
        sapXep(sachList, new Comparator() { //Tạo đối tượng lớp nặc danh
            @Override
            public int compare(Object o1, Object o2) {
                if (!(o1 instanceof Sach) || !(o2 instanceof Sach)){
                    throw new RuntimeException("Loại không đúng");
                }
                //Ép kiểu xuống
                Sach sach1 = (Sach) o1;
                Sach sach2 = (Sach) o2;
                return sach1.gia - sach2.gia;//Sắp xếp theo giá
            }
        });

         */

        sapXep(sachList, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                //Ép kiểu xuống
                Sach sach1 = (Sach) o1;
                Sach sach2 = (Sach) o2;
                return sach1.soLuongBan - sach2.soLuongBan;//Sắp xếp theo số lượng bán
            }
        });

        System.out.println(Arrays.toString(sachList));
    }

    /*
         public interface Comparator<T> {
            int compare(T o1, T o2);
         }
     */
    //Gán đối tượng lớp triển khai interface Comparator cho interface Comparator  Đa hình
    public static void sapXep(Sach[] sachList, Comparator c){
        for (int i = 0; i < sachList.length - 1; i++) {
            for (int j = 0; j < sachList.length - i - 1; j++) {
                //Gọi phương thức compare là gọi phương thức triển khai của lớp triển khai interface
                if (c.compare(sachList[j],sachList[j+1]) > 0){
                    Sach temp = sachList[j];
                    sachList[j] = sachList[j+1];
                    sachList[j+1] = temp;
                }
            }
        }
    }
}

class Sach{
    String tenSach;
    int gia;

    //Số lượng bán
    int soLuongBan;


    public Sach(String tenSach, int gia, int soLuongBan) {
        this.tenSach = tenSach;
        this.gia = gia;
        this.soLuongBan = soLuongBan;
    }

    @Override
    public String toString() {
        return tenSach + " " + gia + " " + soLuongBan;
    }

}

Thẻ: Java Date API Array manipulation SimpleDateFormat DateTimeFormatter

Đăng vào ngày 2 tháng 6 lúc 18:56