首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java从双纪元到日期时间

Java中的时间处理经历了从“双纪元”(即DateCalendar)到现代的java.time包的演变。这一变化主要是为了解决旧API中的一些设计缺陷和不便之处。

基础概念

双纪元(Legacy Date and Time API)

  • Date:表示特定的瞬间,精确到毫秒。
  • Calendar:用于日期字段之间转换和操作。

这两个类在Java早期版本中被广泛使用,但它们存在一些问题,比如线程不安全、API设计不佳等。

现代日期时间API(java.time包)

Java 8引入了新的日期和时间API,位于java.time包中,包括:

  • LocalDate:表示不带时区的日期。
  • LocalTime:表示不带时区的时刻。
  • LocalDateTime:结合了日期和时间。
  • ZonedDateTime:带有时区的日期和时间。
  • Instant:表示时间线上的一个点,通常用于记录事件的时间戳。

优势

  1. 不可变性:新的API中的大多数类都是不可变的,这有助于线程安全和简化并发编程。
  2. 更清晰的API设计:方法命名更加直观,易于理解和使用。
  3. 时区处理:提供了更好的时区支持。
  4. 更强的类型安全:通过不同的类来明确区分日期、时间、日期时间等概念。

类型与应用场景

  • LocalDate:适用于处理生日、节假日等仅需要日期的场景。
  • LocalTime:适用于处理仅需要时间的场景,如会议安排。
  • LocalDateTime:适用于同时需要日期和时间的场景,但不涉及时区。
  • ZonedDateTime:适用于需要考虑时区的场景,如国际会议或跨时区应用。
  • Instant:适用于记录精确到纳秒的时间戳,常用于日志记录或性能监控。

示例代码

使用旧的Date和Calendar

代码语言:txt
复制
import java.util.Date;
import java.util.Calendar;

public class LegacyExample {
    public static void main(String[] args) {
        Date now = new Date();
        System.out.println("Current date and time: " + now);

        Calendar calendar = Calendar.getInstance();
        calendar.set(2023, Calendar.JANUARY, 1);
        Date newYear = calendar.getTime();
        System.out.println("New Year's Day: " + newYear);
    }
}

使用新的java.time API

代码语言:txt
复制
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.Instant;

public class ModernExample {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("Today's date: " + today);

        LocalDateTime now = LocalDateTime.now();
        System.out.println("Current date and time: " + now);

        ZonedDateTime zonedNow = ZonedDateTime.now();
        System.out.println("Current date and time with zone: " + zonedNow);

        Instant instant = Instant.now();
        System.out.println("Current instant: " + instant);
    }
}

常见问题及解决方法

问题:旧API中的线程安全问题

原因DateCalendar类不是线程安全的,多线程环境下可能导致数据不一致。

解决方法:使用新的java.time包中的不可变类,或者在必要时对旧API对象进行同步处理。

问题:时区转换错误

原因:旧API在处理时区转换时容易出错,特别是在夏令时切换期间。

解决方法:使用ZonedDateTime进行时区转换,它提供了更准确和可靠的时区处理。

通过这些改进,Java开发者现在可以更高效、更安全地处理日期和时间相关的任务。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java 日期时间

java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。 第一个构造函数使用当前日期和时间来初始化对象。...Date( ) 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。 Date(long millisec) Date对象创建以后,可以调用下面的方法。...获取当前时间实例: import java.util.Date; public class Demo { public static void main(String args[]) {...(date.toString()); } } 运行结果: 日期和时间的格式化编码 时间模式字符串用来指定时间格式。...在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下: 字母 描述 示例 G 纪元标记 AD y 四位年份 2001 M 月份 July or 07 d 一个月的日期 10 h A.M.

2.7K30
  • Java日期和时间

    、时间、数字、货币等格式 zh_CN: 表示的是中国的Local,日期用年月日表示2020-07-05 en_US: 表示的是美国的Local,日期用日月年表示05/07/2020 计算机用Local在日期...、时间、货币和字符串之间进行转换 中国用户 美国用户 购买价格: 12000.0 12,000.00 购买日期: 2020-07-05 05/07/2020 java.time的API java.time...plusDays() 在现在的日期加上具体天数 minusHous() 在现在的时间减去具体的小时 plusWeeks() 在现在的日期时间加上具体的周数 // +5 天...为true时,就会jdbc对应的日期类型会转成java8中的LocateDateTime类型,如果useJSR310Types为false,则还是转成java.util.Date类型。...中的日期类型,记得要在项目中引入mybatis-typehandlers-jsr310,这个主要是处理java8中的日期类型。

    14710

    Java 日期时间处理

    Date java.util.Date对象表示一个精确到毫秒的瞬间; 但由于Date从JDK1.0起就开始存在了,历史悠久,而且功能强大(既包含日期,也包含时间),所以他的大部分构造器/方法都已Deprecated...long getTime(): 获取从1979-01-01 00:00:00 到Date对象之间经过的毫秒值; void setTime(long time): 设置时间,time含义上同. ?...Calendar 由于Date存在缺陷,所以JDK又提供了java.util.Calendar来处理日期和时间.Calendar是一个抽象类,是所有日历类的模板,因此,我们可以继承Calendar来实现其他的历法...数据库存储时间实战 由于时间存储会涉及到跨时区的问题(同一个UTC时间在各个时区显示的是不同的数值).因此,在我们向数据库中插入时间是需要小心谨慎,不能简单单单的使用数据库提供的TIMESTAMP或是DATETIME...类型,比较推荐的是选用一个整数类型(如BIGINT64位与Java的Long类型相同),来存储从`1970-01-01 00:00:00到时间点所经过的毫秒数(具体原因详见:如何正确地处理时间).

    3.5K20

    时间序列 | 从开始到结束日期自增扩充数据

    需求描述 有如下数据,columns = ['医嘱日期', '医嘱时间', '医嘱开始日期', '医嘱开始时间','医嘱优先级', '停止日期', '停止时间', '项目名称'] ?...现要求从医嘱开始日期到停止日期,按照日期自增逻辑扩充数据,其中自增的日期的医嘱开始时间为当日的01:00:00。结果如下图: ?...import numpy as np from datetime import datetime from dateutil.parser import parse 查看原始数据 # 前面步骤略,直接从主题开始...至此医嘱单内容已创建完毕,接下来需要创建自增的时间序列,并以时间序列做主表,以医嘱单内容表做从表,进行表与表之间的连接。...构建时间序列索引表 从医嘱开始日期到停止日期创建pd.date_range() 索引,以医嘱开始时间等于'01:00:00' 为内容创建DataFrame,并重置索引并重命名,还原医嘱开始当日的开始时间

    3K20

    React 日期时间选择器 (DateTime Picker): 从基础到高级

    本文将详细介绍如何在React应用中集成日期时间选择器,包括常见问题、易错点以及如何避免这些问题。 什么是日期时间选择器? 日期时间选择器是一种用户界面组件,允许用户通过图形化的方式选择日期和时间。...相比于手动输入日期和时间,日期时间选择器提供了更好的用户体验和更高的准确性。 选择合适的日期时间选择器库 在React中,有许多可用的日期时间选择器库。...日期时间选择器通常会根据用户的本地时区来显示日期和时间。如果需要处理特定时区的问题,可以使用 moment-timezone 或 date-fns-tz 库来转换日期和时间。 4. 如何自定义样式?...忽视日期格式 不同的日期时间选择器库有不同的日期格式设置方式。如果不正确地设置日期格式,可能会导致日期显示错误。 3. 忽视时区问题 日期时间选择器通常会根据用户的本地时区来显示日期和时间。...如果需要处理特定时区的问题,应该使用相应的库来转换日期和时间。 4. 忽视事件处理 在使用日期时间选择器时,必须正确地处理 onChange 事件,以便在用户选择日期或时间时更新状态。

    32510

    Java 8 日期时间 API

    Java 8 日期时间 API 在旧版本的Java中,日期时间API存在诸多问题,其中有: 非线程安全 - java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一...设计很差 - Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。...java.Date同时包含日期和时间,而java.Date仅包含日期,将其纳入java.sql包并不合理,另外这两个类都有相同的名字,本身就是一个非常糟糕的设计。..."+datestr); 4.注意点 Instant 它代表的是时间戳,比如2016-04-14T14:20:13.592Z,这可以从java.time.Clock类中获取,像这样: Instant current...时区指的是地球上共享同一标准时间的地区。每个时区都有一个唯一标识符,同时还有一个地区/城市(Asia/Tokyo)的格式以及从格林威治时间开始的一个偏移时间。

    1.1K10

    Java 基础概念·Java 日期与时间

    Java 日期与时间 本文为个人学习摘要笔记。 原文地址:廖雪峰 Java 教程之日期和时间 本地化 在计算机中,通常使用 Locale 表示一个国家或地区的日期、时间、数字、货币等格式。...Java 程序获取时间戳最常用的方法 标准库 Java 标准库有两套处理日期和时间的 API: 一套定义在 java.util 这个包里面,主要包括 Date、Calendar 和 TimeZone 这几个类...Java 8 开始,java.time 包提供了新的日期和时间 API,主要涉及的类型有: 本地日期和时间:LocalDateTime,LocalDate,LocalTime; 带时区的日期和时间:ZonedDateTime...提供了新旧两套日期和时间的 API,除非涉及到遗留代码,否则我们应该坚持使用新的 API。...这个奇葩的设计原因要追溯到数据库的日期与时间类型。

    5.1K30

    11.4 Java 日期和时间类

    我们先来看一些基本概念,然后再介绍 Java 的日期和时间 API。关于日期和时间,有一些基本概念,包括时区、时刻、纪元时、年历等。...格林尼治标准时间 1970年1月1日0时0分0秒也被称为 Epoch Time(纪元时)。...Date 类 new Date() 用当前日期和时间创建新的日期对象: new Date(milliseconds) 创建一个零时加毫秒的新日期对象 返回从 1970 年 1月 1 日0时0分0 秒(...Joda-Time 是 Java SE 8 之前的行业标准日期和时间库 Joda-Time 为 Java 日期和时间类提供了质量替代。现在要求用户迁移到 java.time (JSR-310)。...-> LocalDateTime LocalDateTime.now() 慢了8个小时的问题排查 原因是 java 代码中将 new Date() 插入到 mysql 的对应 timestamp 类型的字段中

    4.2K20

    Java基础(十七):日期时间API

    Java基础(十六):String的常用API Java基础(十七):日期时间API Java基础(十八):java比较器、系统相关类、数学相关类 Java基础(十九):集合框架 Java基础(二十)...1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位 } 2、两个Date类 java.util.Date 表示特定的瞬间,精确到毫秒 构造器: Date():使用无参构造器创建的对象可以获取本地当前时间...public Date parse(String source):从给定字符串的开始解析文本,以生成一个日期 举例: @Test public void test3() throws ParseException...API 1、为什么会有新的时间API 可变性:像日期和时间这样的类应该是不可变的 偏移性:Date中的年份是从1900开始的,而月份都从0开始 格式化:格式化只对Date有用,Calendar则不行 此外...新的日期时间API包含: java.time – 包含值对象的基础包 时钟(Clock) 本地日期(LocalDate) 本地时间(LocalTime) 本地日期时间(LocalDateTime

    10610

    Java时间日期格式转换

    突然忘记了时间格式怎么转换,特此做个记录 大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Java时间日期格式转换,希望能够帮助大家进步!!!...突然忘记了时间格式怎么转换,特此做个记录 Java时间格式转换大全 import java.text.*; import java.util.Calendar; public class VeDate...架构师必看网-架构君整理 import java.util.*; import java.text.*; import java.util.Calendar; public class VeDate...星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间 * 此函数返回该日历第一行星期日所在的日期 * * @param sdate * @return */ public static...+ "日"; } } else { // 不是空值,也是一个合法的日期值,则先将其转换为标准的时间格式 sdate = roc.util.RocDate.getOKDate(sdate); s_nd

    4.9K10

    精进:从时间到读书

    算是时间日志第46天的总结 现状 预感,绝大概率的预感,我会投身IT界,基于本身专业考虑。 预感,绝大概率的预感,我会坚持阅读和写作,尔后还衍生的文案策划,基于本身兴趣的考量。...但时间给与我的期限却远远不够。 差不多半年之后,会踏上求职的高峰期。 在社会上谋求安身立命的一席之地。 略显遗憾的是:能力往往不怎么够,要学的其实非常的多。...对于去年年尾的工作三月,始终心怀着感激,正确的人正确的影响了我,开始发现各种不知名的细节,更为重要的是开始通过阅读类型的转变,审视了关于时间的概念。 时间之下,审视思考本身。...过程 46天的时间日志带给我什么? 并没有所谓的关于时间的精准判断,到是明确知晓了时间的流向,可能坚持的时间还不足说道。 时间流逝的动向,开始审视思考和思维本身。...复述:用自己的话,或者换种方式进行文章的章节的复述 引为己用:联系自己的行为和过往的历史经验加以分析 学习之道有章节讲述:时间变慢,改变本能,激发最佳状态。

    61350

    Java中时间日期的操作

    参考链接: Java中的date after()方法 Java中时间日期的操作  相关的类  Date  java.util.Date  很多方法已经过时,现在主要用于在Calendar类和String...主要方法:  Date    getTime()           返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。...- 第一个星期  Calendar 使用两个参数定义了特定于语言环境的 7 天制星期:星期的第一天和第一个星期中的最小一天(从 1 到 7)。这些数字取自构造 Calendar 时的语言环境资源数据。...在日期和时间模式字符串中,未加引号的字母 ‘A’ 到 ‘Z’ 和 ‘a’ 到 ‘z’ 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (‘) 引起来,以免进行解释。”””...常用的方法示例  日期及时间的加减计算日期转字符串字符串转日期日期相关其他信息(星期,一年的第几天…)  import java.text.ParseException; import java.text.SimpleDateFormat

    3.4K20

    Java中的时间和日期处理

    一、日期处理 旧版本 Date 在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。它在易用性上许多问题,下面就谈谈这个类的缺点。 缺点一:易用性较差。...Java 8 日期和时间:LocalDate和LocalTime LocalDate类的实例是一个不 可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关的信息。...三格式化日期 旧版本:DateFormat Java 8:DateTimeFormatter 新的 java.time.format 包就是格式化以及解析日期、时间对象的。...从字符串生成时间 //2.1 通过解析代表日期或时间的字符串重新创建该日期对象。...8:ZoneId 之前你看到的Java8中的日期和时间的种类都不包含时区信息。

    2.7K40
    领券