探索 Java 中的 Date Calendar TimeZone 和Timestamp

多维聚合中的数据变形术:从GROUP BY到指标编织的实战指南 多维聚合是BI分析与OLAP引擎的核心能力,本质是在维度立方体(Cube)上进行正交分组与衍生计算;其技术原理超越传统SQL的GROUP BY,依赖维度裁剪、指标重塑、跨维对齐和衍生编织四大操作范式;它支撑销售归因、用户漏斗、风控逾期率等关键业务指标的准确产出;典型应用场景包括电商多维漏斗分析、银行滚动逾期率计算、IoT设备实时告警聚合;本文聚焦Data Manipulation与Multi-Dimensional Aggregation在真实工程中的协同落地,提供Pandas/DuckDB/Spark三栈 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 探索 Java 中的 Date, Calendar, TimeZone 和Timestamp 对象

宋晟 (shengsong@hotmail.com)

2001 年 11 月

如何计时,自古以来就是一个有着各种答案的问题。中国人从习惯使用农历计时,到选择便于与世界沟通的公元计时。在生活中这两者又一起使用,这已经融入到文化中。在计算机世界里,计时也是一个丰富多采的话题。各个系统各有一套方法,例如 2000 年引起全世界关注的"千年虫",就是因为计时系统设计上的限制而产生的。那么 Java 作为一种通用编程语言和运行平台,它的计时系统是如何设计的,我们在应用程序的开发中又如何驾驭它呢?对象的状态总是要被储存起来的,那么我们又要注意哪些情况呢?

1 最常用的对象(概念最易被混逍的对象) Date
在 Java 中,如何获得系统当前的时间?恐怕一个合格的 Java 程序员可以列举出至少下面这种:
Date date = new Date();
// 打印出具体的年,月,日,小时,分钟,秒钟 以及时区
System.out.println(date);

看起来 Date 这个对象包含了相当丰富的时间信息。那么我们能不能用它来构件任何一个指定的时间呢?很多的应用程序是需要用户输入一个特定的时间。



// 我们能不能用下面的代码构件出 2001/8/8 8:8

    import java.io.*;

    import java.util.*;



    public class WhatIsDate

    {

        public static void main(String[] args) {

            Date date = new Date(2001, 8, 8, 8, 8, 8);

            System.out.println(date);

        }

    }

Java 的编译器竟然报如下信息 (Sun JDK1.3, Windows 2000 中文下)



注意:

WhatIsDate.java 使用或覆盖一个不鼓励使用的API。

注意:

使用-deprecation重新编译,以得到详细信息。!

我们使用 javac -deprecation WhatIsDate.java, 得到如下信息:



WhatIsDate.java:7: 警告:

在java.util.Date中的Date(int,int,int,int,int,int)已经不提倡使用

            Date date = new Date(2001, 8, 8, 8, 8, 8);

                        ^

1 warning

那么 Date 对象究竟是为了满足哪个需求呢?看来它不是用来实现基于年/月/日 小时:分钟 的时间表述。我们查看 Java 的文档,我们看到有 getTime() 方法,它返回的竟然是一个 long 值。
System.out.println(date.getTime());

文档进一步又告诉我们这个值代表了当前系统的时间离1970/1/1 0:0 的毫秒差,而且是在 GMT 时区下(也被称为 EPOC)。如果我们指定的时间是在此之前的,那它将返回一个负数值。

这个发现让我们对 Date 对象有了一个全新的认识-Date 存放的是与 EPOC 的偏差值。换而言之我们也可通过 long 类型来表示时间?对了,这个猜想是得到了 Java 的支持:



    // 第二种获得当前时间的方法

    long dateInMilliSeconds = System.currentTimeMillis();

    // 这时候打印出的只是一串数字而已

    System.out.println(dateInMilliSeconds);

对程序执行效率敏感的程序员可以发现这个方法只是生成一个 Java 的原始类型 (primitive type) long, 不需要实例化一个对象。因此如果我们对时间的处理只是在内部进行时,可以用 long 来代替 Date 对象。

最典型的应用就是在一段代码开始和结束时,分别获得系统当前的时间,然后计算出代码执行所需的时间(微秒级)。



    long start = System.currentTimeMillis();

    // 代码段

    System.out.println("需要 " (System.currentTimeMillis()-start) " 微秒");

那么当我们要把这个 long 值已更为友好的表现形式显示处理的时候,我们可以用它来构造 Date 对象:
Date date = new Date(dateInMilliSeconds);
System.out.println(date);

我们看到了在 Java 中对时间最为基本的表示,有通过对EPOC 的偏差值进行处理。Date 对象是对它的一个对象的封装。我们同时也看到了,在现时世界中我们对时间的描述通常是通过"某年某月某日某时某分"来定义的。Date 的显示(实际上是 toString() 方法)描述了这些信息,但 Java 并不建议我们用这种方式直接来构件 Date 对象。因此我们需要找出哪个对象可以实现这个需求。这就是我们下面就要讲述的 Calendar 对象的功能。

在我们进一步研究 Calendar 之前,请记住 Date 只是一个对 long 值(基于 GMT 时区)的对象封装。它所表现出来的年/月/日 小时:分钟 时区的时间表述,只是它的 toString() 方法所提供的。千万不要为这个假象所迷惑。

2 强大的 Calendar
首先请记住 Calendar 只是一个抽象类, 也就是说你无法直接获得它的一个实例,换而言之你可以提供一个自己开发的 Calendar 对象。

那究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历、阴(农)历之分。它们的区别在哪呢?

比如有:
月份的定义 - 阳`(公)历 一年12 个月,每个月的天数各不同;阴(农)历,每个月固定28天
每周的第一天 - 阳(公)历 星期日是第一天;阴(农)历,星期一是第一天

实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一个人的生日是"八月八日" 那么一种可能是阳(公)历的八月八日,但也可以是阴(农)历的日期。所以为了计时的统一,必需指定一个日历的选择。那现在最为普及和通用的日历就是 "Gregorian Calendar"。也就是我们在讲述年份时常用 "公元几几年"。Calendar 抽象类定义了足够的方法,让我们能够表述日历的规则。Java 本身提供了对 "Gregorian Calendar" 规则的实现。我们从 Calendar.getInstance() 中所获得的实例就是一个 "GreogrianCalendar" 对象(与您通过 new GregorianCalendar() 获得的结果一致)。

下面的代码可以证明这一点:



    import java.io.*;

    import java.util.*;



    public class WhatIsCalendar

    {

        public static void main(String[] args) {

            Calendar calendar = Calendar.getInstance();

            if (calendar instanceof GregorianCalendar)

                System.out.println("It is an instance of GregorianCalendar");

        }

    }

Calendar 在 Java 中是一个抽象类(Abstract Class),GregorianCalendar 是它的一个具体实现。

我们也可以自己的 Calendar 实现类,然后将它作为 Calendar 对象返回(面向对象的特性)。在 IBM alphaWorks 上,IBM 的开发人员实现了多种日历(http://www.alphaworks.ibm.com/tech/calendars)。同样在 Internet 上,也有对中国农历的实现。本文对如何扩展 Calendar 不作讨论,大家可以通过察看上述 Calendar 的源码来学习。

Calendar 与 Date 的转换非常简单:



    Calendar calendar = Calendar.getInstance();

    // 从一个 Calendar 对象中获取 Date 对象

    Date date = calendar.getTime();

    // 将 Date 对象反应到一个 Calendar 对象中,

    // Calendar/GregorianCalendar 没有构造函数可以接受 Date 对象

    // 所以我们必需先获得一个实例,然后设置 Date 对象

    calendar.setTime(date);

Calendar 对象在使用时,有一些值得注意的事项:

1. Calendar 的 set() 方法

set(int field, int value) - 是用来设置"年/月/日/小时/分钟/秒/微秒"等值

field 的定义在 Calendar 中

set(int year, int month, int day, int hour, int minute, int second) 但没有

set(int year, int month, int day, int hour, int minute, int second, int millisecond) 前面 set(int,int,int,int,int,int) 方法不会自动将 MilliSecond 清为 0。

另外,月份的起始值为0而不是1,所以要设置八月时,我们用7而不是8。

calendar.set(Calendar.MONTH, 7);

我们通常需要在程序逻辑中将它清为 0,否则可能会出现下面的情况:



    import java.io.*;

    import java.util.*;



    public class WhatIsCalendarWrite

    {

        public static void main(String[] args) throws Exception{

            ObjectOutputStream out =

                new ObjectOutputStream(

                    new FileOutputStream("calendar.out"));

            Calendar cal1 = Calendar.getInstance();

            cal1.set(2000, 7, 1, 0, 0, 0);

            out.writeObject(cal1);

            Calendar cal2 = Calendar.getInstance();

            cal2.set(2000, 7, 1, 0, 0, 0);

            cal2.set(Calendar.MILLISECOND, 0);

            out.writeObject(cal2);

            out.close();

        }

    }

我们将 Calendar 保存到文件中



    import java.io.*;

    import java.util.*;



    public class WhatIsCalendarRead

    {

        public static void main(String[] args) throws Exception{

            ObjectInputStream in =

                new ObjectInputStream(

                    new FileInputStream("calendar.out"));

            Calendar cal2 = (Calendar)in.readObject();

            Calendar cal1 = Calendar.getInstance();

            cal1.set(2000, 7, 1, 0, 0, 0);

            if (cal1.equals(cal2))

                System.out.println("Equals");

            else

                System.out.println("NotEqual");

            System.out.println("Old calendar " cal2.getTime().getTime());

            System.out.println("New calendar " cal1.getTime().getTime());

            cal1.set(Calendar.MILLISECOND, 0);

            cal2 = (Calendar)in.readObject();

            if (cal1.equals(cal2))

                System.out.println("Equals");

            else

                System.out.println("NotEqual");

            System.out.println("Processed Old calendar " cal2.getTime().getTime());

            System.out.println("Processed New calendar " cal1.getTime().getTime());

        }

    }

然后再另外一个程序中取回来(模拟对数据库的存储),但是执行的结果是:



NotEqual

Old calendar 965113200422 <------------ 最后三位的MilliSecond与当前时间有关

New calendar 965113200059 <-----------/

Equals

Processed Old calendar 965113200000

Processed New calendar 965113200000

另外我们要注意的一点是,Calendar 为了性能原因对 set() 方法采取延缓计算的方法。在 JavaDoc 中有下面的例子来说明这个问题:



Calendar cal1 = Calendar.getInstance();

    cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31

    cal1.set(Calendar.MONTH, Calendar.SEPTEMBER); //应该是 2000-9-31,也就是 2000-10-1

    cal1.set(Calendar.DAY_OF_MONTH, 30); //如果 Calendar 转化到 2000-10-1,那么现在的结果就该是 2000-10-30

    System.out.println(cal1.getTime()); //输出的是2000-9-30,说明 Calendar 不是马上就刷新其内部的记录

在 Calendar 的方法中,get() 和 add() 会让 Calendar 立刻刷新。Set() 的这个特性会给我们的开发带来一些意想不到的结果。我们后面会看到这个问题。

2. Calendar 对象的容错性,Lenient 设置
我们知道特定的月份有不同的日期,当一个用户给出错误的日期时,Calendar 如何处理的呢?



    import java.io.*;

    import java.util.*;



    public class WhatIsCalendar

    {

        public static void main(String[] args) throws Exception{

            Calendar cal1 = Calendar.getInstance();

            cal1.set(2000, 1, 32, 0, 0, 0);

            System.out.println(cal1.getTime());

            cal1.setLenient(false);

            cal1.set(2000, 1, 32, 0, 0, 0);

            System.out.println(cal1.getTime());

        }

    }

它的执行结果是:



    Tue Feb 01 00:00:00 PST 2000

    Exception in thread "main" java.lang.IllegalArgumentException

        at java.util.GregorianCalendar.computeTime(GregorianCalendar.java:1368)

        at java.util.Calendar.updateTime(Calendar.java:1508)

        at java.util.Calendar.getTimeInMillis(Calendar.java:890)

        at java.util.Calendar.getTime(Calendar.java:871)

        at WhatIsCalendar.main(WhatIsCalendar.java:12)

当我们设置该 Calendar 为 Lenient false 时,它会依据特定的月份检查出错误的赋值。

3. 不稳定的 Calendar

我们知道 Calendar 是可以被 serialize 的,但是我们要注意下面的问题



    import java.io.*;

    import java.util.*;



    public class UnstableCalendar implements Serializable

    {



        public static void main(String[] args) throws Exception{

            Calendar cal1 = Calendar.getInstance();

            cal1.set(2000, 7, 1, 0, 0 , 0);

            cal1.set(Calendar.MILLISECOND, 0);

            ObjectOutputStream out =

                new ObjectOutputStream(

                new FileOutputStream("newCalendar.out"));

            out.writeObject(cal1);

            out.close();

            ObjectInputStream in =

                new ObjectInputStream(

                new FileInputStream("newCalendar.out"));

            Calendar cal2 = (Calendar)in.readObject();

            cal2.set(Calendar.MILLISECOND, 0);

            System.out.println(cal2.getTime());

        }

    }

运行的结果竟然是: Thu Jan 01 00:00:00 PST 1970

它被复原到 EPOC 的起始点,我们称该 Calendar 是处于不稳定状态。这个问题的根本原因是 Java 在 serialize GregorianCalendar 时没有保存所有的信息,所以当它被恢复到内存中,又缺少足够的信息时,Calendar 会被恢复到 EPOCH 的起始值。Calendar 对象由两部分构成:字段和相对于 EPOC 的微秒时间差。字段信息是由微秒时间差计算出的,而 set() 方法不会强制 Calendar 重新计算字段。这样字段值就不对了。

下面的代码可以解决这个问题:



    import java.io.*;

    import java.util.*;



    public class StableCalendar implements Serializable

    {



        public static void main(String[] args) throws Exception{

            Calendar cal1 = Calendar.getInstance();

            cal1.set(2000, 7, 1, 0, 0 , 0);

            cal1.set(Calendar.MILLISECOND, 0);

            ObjectOutputStream out =

                new ObjectOutputStream(

                new FileOutputStream("newCalendar.out"));

            out.writeObject(cal1);

            out.close();

            ObjectInputStream in =

                new ObjectInputStream(

                new FileInputStream("newCalendar.out"));

            Calendar cal2 = (Calendar)in.readObject();

            cal2.get(Calendar.MILLISECOND); //先调用 get(),强制 Calendar 刷新

            cal2.set(Calendar.MILLISECOND, 0);  //再设值

            System.out.println(cal2.getTime());

        }

    }

运行的结果是: Tue Aug 01 00:00:00 PDT 2000

这个问题主要会影响到在 EJB 编程中,参数对象中包含 Calendar 时。经过 Serialize/Deserialize 后,直接操作 Calendar 会产生不稳定的情况。

4. add() 与 roll() 的区别

add() 的功能非常强大,add 可以对 Calendar 的字段进行计算。如果需要减去值,那么使用负数值就可以了,如 add(field, -value)。

add() 有两条规则:

当被修改的字段超出它可以的范围时,那么比它大的字段会自动修正。如:
Calendar cal1 = Calendar.getInstance();
cal1.set(2000, 7, 31, 0, 0 , 0); //2000-8-31
cal1.add(Calendar.MONTH, 1); //2000-9-31 => 2000-10-1, 对吗?
System.out.println(cal1.getTime()); //结果是 2000-9-30

另一个规则是,如果比它小的字段是不可变的(由 Calendar 的实现类决定),那么该小字段会修正到变化最小的值。

以上面的例子,9-31 就会变成 9-30,因为变化最小。

Roll() 的规则只有一条:
当被修改的字段超出它可以的范围时,那么比它大的字段不会被修正。 如:



Calendar cal1 = Calendar.getInstance();

cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日

cal1.roll(Calendar.WEEK_OF_MONTH, -1); //1999-6-1, 周二

cal1.set(1999, 5, 6, 0, 0, 0); //1999-6-6, 周日

cal1.add(Calendar.WEEK_OF_MONTH, -1); //1999-5-30, 周日

WEEK_OF_MONTH 比 MONTH 字段小,所以 roll 不能修正 MONTH 字段。

由于 Calendar 对象可以将一个时间转化成我们所需要的不同字段信息,可以帮助我们的开发任务。

Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat的区别于用法 主要介绍了Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat的区别于用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 立即下载

相关推荐

BurpSuit在不同浏览器中配置代理

文章通过分享各大浏览器如何设置代理的知识,帮助初学者快速掌握代理配置相关技能。

北冥同学的成长记录笔记 1万+

Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

一、概述 1、问题描述 使用Java处理时间时,我们可能会经常发现时间不对,比如相差8个小时等等,其真实原因便是TimeZone。只有正确合理的运用TimeZone,才能保证系统时间无论何时都是准确的。由于我在外企工作,服务器在美国,美国也有很多时区,经常会碰到向处于不同时区的服务器发请求时需要考虑时区转换的问题。譬如,服务器位于西八区(GMT-8:00),而身处东八区的用户想要查询当天的销售记录。则需把东八区的“今天”这个时间范围转换为服务器所在时区的时间范围。 2、时区认识 ...

lyb3290的博客 1969

Linux 系统管理员必备:Chrome 企业版离线部署全攻略(含 RPM/DEB 双版本)

本文详细介绍了Linux系统管理员如何离线部署Chrome企业版,涵盖RPM和DEB双版本。从获取官方离线安装包到静默安装、权限配置及企业级策略管理,提供全流程解决方案,特别适合Ubuntu等DEB系系统管理员参考。

f9g0h的博客 494

PX30 android8.1 时区更改

在源码的build/tools/buildinfo.sh脚本文件中添增echo "persist.sys.timezone=Asia/Shanghai"(强制设置属性) #!/bin/bash echo "# begin build properties" echo "# autogenerated by buildinfo.sh" echo "ro.build.id=$BUILD_ID" ech...

目前从事linux驱动开发,多交流多学习吧 487

Anaconda离线创建python环境

既然是离线创建python环境,就需要有一个已经创建好的python环境。所以我们有两台win10的机器,分别是A和B。两台机器都安装了anaconda。其中A可以连网,因此我们在A上创建好一个python2.7的环境py27,然后将py27移植(安装)到B上。B连不连网都无所谓。 一、机器上A上创建python2.7的环境py27 有两种方法: 方法1:使用Anaconda的图形界面。首先,点击Environments->Create,然后输入要创建的环境名称"py27",然后选择2.7,如图

FY_2018的博客 6787

模式分类识别 | TCN时间卷积神经网络多特征分类预测(Matlab完整程序)

模式分类识别 | TCN时间卷积神经网络多特征分类预测(Matlab完整程序)

前程算法屋的博客 748

java date转换时区(timeZone)

java date转换时区(timeZone)

BQXGZ的博客 7098

9 硬件工程师笔面试高频知识考点真题解析——运算放大器

运算放大器(运放)摘要 运放是一种高增益、差分输入的模拟集成电路,具有虚短(线性区输入电压相等)和虚断(输入电流为零)特性,支持负反馈(线性放大)和开环/正反馈(饱和区比较)两种工作模式。关键特性包括高输入阻抗、低输出阻抗,理想运放参数(如无限增益)与实际参数(如有限带宽)的差异。 选型要点: 信号特性:直流/低频信号关注失调电压(Vos)、温漂;高频信号侧重带宽(GBW)和压摆率(SR)。 电源条件:单/双电源供电、电压范围及功耗需求(如电池设备需低静态电流)。 精度与噪声:微弱信号需低噪声运放,高精度场

XU157303764的博客 1678

java date类 时区_Java Date 与时区

标签:Java 中,一个 Date 类对象内部包含2个信息:绝对时间,即从1970-1-1 00:00:00.000 经过的毫秒数,表示为long类型时区绝对时间与时区无关。假设同一时刻,地球东西半球各有一位程序狗执行了以下代码,TA们将各自看到2行输出,其中第一行是相同的数值,而第二行则(极有可能)显示出不同的时间读数:1 Date now = newDate();23 System.out.p...

weixin_39812186的博客 2851

YOLOv8【项目实战四】遥感图像目标检测:应对特殊场景的挑战,如何处理遥感图像通常具有的大尺寸、多尺度、方向多变等特点,并对 YOLOv8 进行相应调整(含源码)

遥感图像目标检测优化策略 核心挑战 图像尺寸大:遥感图像通常达数万像素,直接缩放导致小目标丢失 多尺度目标:同一图像包含几十像素的小目标和跨图像的大目标 方向多样性:目标360度任意旋转,水平框检测效果差 优化解决方案 滑动窗口分块处理: 采用1024x1024窗口大小 设置20%-30%重叠率防止边界漏检 全局坐标转换实现检测结果拼接 多尺度特征融合: 改进FPN结构增强小目标检测 自适应感受野处理不同尺寸目标 上下文信息聚合提升检测精度 旋转目标检测: 引入旋转边界框表示 角度预测分支增强方向感知 旋转

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 619

Oracle 查看 rman 备份情况 SQL 语句

每天一个 DBA 小知识,助你更进一步!

LuciferLiu_DBA 3123

处理日期与时间的时区问题:使用Java的时区类和日期格式化

请注意,Java 8 引入了新的日期和时间 API(`java.time` 包),用于替代旧的 `java.util.Date` 和 `java.util.Calendar` 类。在上述示例中,我们使用 `TimeZone` 类来设置时区,可以通过指定时区的 ID(如 `"America/New_York"`)来获取对应的时区对象。然后,我们可以将时区应用到当前线程中,以影响后续日期和时间操作的行为。使用时区类和日期格式化可以帮助我们在不同的时区处理日期和时间,并确保正确的时区转换和显示。

m0_75198698的博客 2260

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

探索 Java 中的 Date, Calendar, TimeZone 和Timestamp

<br />探索 Java 中的 Date, Calendar, TimeZone 和Timestamp<br />java 2010-12-31 08:56:49 阅读8 评论0  字号:大中小 订阅<br /><br />对象<br />    宋晟 (shengsong@hotmail.com)<br /><br />2001 年 11 月<br /><br />如何计时,自古以来就是一个有着各种答案的问题。中国人从习惯使用农历计时,到选择便于与世界沟通的公元计时。在生活中这两者又一起使用,这已经融入

yy6060 794

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

探索 Java 中的 TimeZone

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 431

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java时间处理实战:从java.time到Spring Boot统一方案

时间处理是软件开发中的基础概念,涉及时刻、时区和时间戳等核心维度。其原理在于将绝对时间点与本地表示分离,通过UTC标准时间进行统一存储和计算。这一技术价值在于解决跨时区协作、夏令时转换等复杂场景下的数据一致性问题,广泛应用于全球化的电商、社交和金融系统。在Java生态中,java.time API提供了现代、类型安全的解决方案,而Spring Boot项目可通过Jackson配置实现前后端时间格式的统一。本文聚焦Java时间处理的最佳实践,涵盖java.time API详解、Spring Boot统一配置方

weixin_30700099的博客 365

计算机时间处理:从时分秒到UTC、时区与数据库存储的工程实践

时间处理是计算机科学中的基础概念,涉及时刻、时长和周期的精确度量。其核心原理基于UTC(协调世界时)作为全球统一的时间基准,并通过时区规则处理不同地区的本地时间表示,其中夏令时是时区管理的重要部分。在技术价值上,正确的时间处理能确保系统日志、事务记录和分布式协调的时序一致性,避免因时区混淆、精度不足或日历规则导致的隐蔽错误。应用场景广泛覆盖后端服务、数据库设计、日志系统与跨时区业务。本文聚焦于通过Python datetime和Java java.time库的实战,结合数据库的TIMESTAMP与DATET

weixin_34414196的博客 360

Java 日期和时间

日期和时间是一个比较复杂的概念,Java 8之前的设计有一些不足,业界有一个广泛使用的第三方类库 Joda-Time,Java 8受Joda-Time影响,重新设计了日期和时间API,新增了一个包java.time。虽然Java 8之前的API有一些不足,但依然是被大量使用的。

知乐的博客 1510

日期时间相关

【代码】日期时间相关。

Chris的博客 141

java timezone_详解Java中的时区类TimeZone的用法

一、TimeZone 简介TimeZone 表示时区偏移量,也可以计算夏令时。在操作 Date, Calendar等表示日期/时间的对象时,经常会用到TimeZone;因为不同的时区,时间不同。下面说说TimeZone对象的 2种常用创建方式。1.获取默认的TimeZone对象使用方法:TimeZone tz = TimeZone.getDefault()2.使用 getTimeZone(Stri...

weixin_42485891的博客 8558

JAVA date timezone 的用法

Locale myLocale = Locale.getDefault();     // Locale.setDefault(Locale.CHINA);     // myLocale = Locale.getDefault();      System.out.println(myLocale.getCountry());      System.out.println(myLoca

大树叶 技术专栏 1642

java时间Date,timestamp,timezone

更多内容,请查看博客原文:java时间Date,timestamp,timezone https://finolo.gy/2020/01/java时间Date-timestamp-timezone/ 文中输出的时间,都是相同的,便于读者观看。 Date转Timestamp Date date = new Date(); long currentMillis = date.getTime() Sys...

footrip的博客 761

Java的日期与时间java.util.TimeZone简介说明

Java的日期与时间java.util.TimeZone简介说明

qq_25073223的博客 898

探索java中复杂的时区

Java 中的时区到底是什么东西,Spring 时间格式化怎么用,本文告诉你

作草分茶 2063

java date指定时区_关于java Date和时区的问题 (转)

java2平台为我们提供了丰富的日期时间API。如java.util.Date;java.util.calendar;java.text.DateFormat等。那么它们之间有什么关系呢?首先,java.util.Date代表一个时间点,其值为距公元1970年1月1日 00:00:00的毫秒数。所以它是没有时区和Locale概念的。java通过如下形式取得当前时间点:Date now = new ...

weixin_39867125的博客 3062

Java 日期处理 Date 、Calendar 和TimeZone类

以下内容部分来自 疯狂Java讲义/李刚 ,博客仅用于个人笔记及帮助他人用途,无任何商业目的,如有侵权,请联系作者删除。 Date 类Java提供了 Date 类来处理日期、时间(此处的Date是指 java.util包下的Date类,而不是java.sql 包下的Date类),Date对象既包含日期,也包含时间。Date类从 JDK1.0 起就开始存在了。但正因为它历史悠久,所以它的大部分构造器、

张可的博客 1669
上一篇: 使用策略文件读取服务器端文件
下一篇: Java 的UML建模:(1)序列图简介
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值