• Java 中的日期与时间


    基础知识

    • 日期: 类似于 2018-12-12
    • 时间: 类似于 2018-12-12 12:12:12
    • 时刻: 类似于 2018-12-12 12:12:12
    • 地区: 计算机中的 Locale, 如 zh_CN, en_US 等, 影响着对于日期, 时间, 货币等格式的显示
    • EpochTime: 从 1970 年 1 月 1 日 UTC+00:00 到现在的秒数(不是毫秒数), 大致可认为与 TimeStamp 等价
    • 时区: 全球共 24 个, 伦敦 (GMT+00:00) 的是标准时区
    • GMT 与 UTC 大致可以认为是等价的, GMT 与 UTC 表示的时间不受夏令时影响, 而以地区(如 America/New_York)表示的时间受夏令时影响
    • 日期在计算机中都存储为 EpochTime(即 TimeStamp), 所以全球的计算机都是相同的, 但是因为计算机地区等设置的不同, 所以显示为不同的时间

    Date 与 Calendar

    Date 的用法

    // 获取一个 Date 对象, 即表示现在的时刻
    Date date = new Date();
    // 获取 TimeStamp
    long timestamp = date.getTime();
    // timestamp 生成 Date
    date = new Date(timestamp);
    // 转换为默认格式的字符串
    String dateString = date.toString();
    // 按照指定格式转换
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    dateString = simpleDateFormat.format(date);
    // 按照指定格式字符串解析为 Date
    date = simpleDateFormat.parse(dateString);
    

    Calendar 的用法

    // 获取一个 Calendar
    Calendar calendar = Calendar.getInstance();
    // 获取今天是本月的第几天
    int day = calendar.get(Calendar.DAY_OF_MONTH);
    // 设置为指定时间
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    // 转换为 Date
    Date date = calendar.getTime();
    // 转换为 timestamp
    long timestamp = calendar.getTimeInMillis();
    

    LocalDateTime, ZonedDateTime 与 Instant

    LocalDateTime 的用法

    // 获取一个 LocalDateTime
    LocalDateTime localDateTime = LocalDateTime.now();
    // 获取一个指定的 LocalDateTime, 需要注意月份从 1 开始而非 0, 所以 12 月用 12
    localDateTime = LocalDateTime.of(2018, 12, 12, 21, 36, 36);
    // LocalDateTime 格式化为指定格式
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String localDateTimeString = dateTimeFormatter.format(localDateTime);
    // 按照指定格式解析 LocalDateTime, 需要注意这里 DateTimeFormatter 是作为参数参入
    localDateTime = LocalDateTime.parse(localDateTimeString, dateTimeFormatter);
    // 减去一天, 需要注意该对象是不可变的
    localDateTime = localDateTime.minusDays(1);
    // 小时设置为 12 点
    localDateTime = localDateTime.withHour(12);
    // 设置为本月的第一天
    localDateTime = localDateTime.withDayOfMonth(1);
    // 设置为本月的最后一天, 注意这里是 TemporalAdjusters 而不是 TemporalAdjuster
    localDateTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
    // 判断两个 LocalDateTime 的先后
    boolean before = localDateTime.isBefore(LocalDateTime.now());
    // 计算两个 LocalDate 相差的天数
    Period period = LocalDate.now().until(LocalDate.of(2019, 1, 1));
    long days = period.getDays();
    // 计算两个 LocalDateTime 相差的天数, 可能为负数
    days  = localDateTime.until(LocalDateTime.now(), ChronoUnit.DAYS);
    // 距离 EpochTime 的天数
    days = LocalDate.now().toEpochDay();
    // LocalDateTime 无法与 timestamp 进行转换, 因为它没有时区的概念
    

    ZonedDateTime 相当于 LocalDateTime 加上了一个 ZoneId
    Instant 可以理解为 TimeStamp, 也就是说相当于一个 Long 的封装类

    // 从 LocalDateTime 获取 ZonedDateTime
    ZonedDateTime zonedDateTime = LocalDateTime.now().atZone(ZoneId.of("Asia/Shanghai"));
    // 从 Instant 获取 ZonedDateTime
    zonedDateTime = Instant.now().atZone(ZoneId.systemDefault());
    // 获取指定的 Instant, 需要注意 System.currentTimeMillis() 返回的是毫秒, 而 TimeStamp 是秒
    Instant instant = Instant.ofEpochSecond(System.currentTimeMillis() / 1000);
    // TimeStamp 获取 LocalDateTime
    LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(
            // 获取当前的时间戳(timestamp)
            instant.getEpochSecond(),
            // 毫秒
            0,
            // 获取系统的 ZoneOffset, 即时区偏移
            OffsetDateTime.now().getOffset());
    // 星期相关的操作
    LocalDate now = LocalDate.now();
    LocalDate sundayDate = now.with(DayOfWeek.SUNDAY);
    int sundayValue = sundayDate.getDayOfWeek().getValue();
    Instant yesterday = Instant.now().minus(1, ChronoUnit.DAYS);
    
  • 相关阅读:
    HTTP-接触
    什么是虚拟机-粗略学习
    jQuery中的动画理论干货
    jQuery-中的事件
    熟悉又陌生的快捷方式
    jQuery中的DOM操作
    jQuery与javascript库
    jQuery-选择器(2)
    jest操作 Elasticsearch
    配置 Kibana
  • 原文地址:https://www.cnblogs.com/seliote/p/10111300.html
Copyright © 2020-2023  润新知