【时间和时区】Date与String

AviatorScript表达式引擎中string_to_date()内置函数是否支持时区指定功能?可以指定时区吗? 🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀! 阅读详情

Date中保存的是什么

在java中,只要我们执行

Date date = new Date();

就可以得到当前时间。如:

Date date = new Date();
System.out.println(date);

输出结果是: Thu Aug 24 10:15:29 CST 2017

也就是我执行上述代码的时刻:2017年8月24日10点15分29秒。是不是Date对象里存了年月日时分秒呢?不是的,Date对象里存的只是一个long型的变量,其值为自1970年1月1日0点至Date对象所记录时刻经过的毫秒数,调用Date对象getTime()方法就可以返回这个毫秒数,如下代码:

Date date = new Date();
System.out.println(date + ", " + date.getTime());

输出结果是: Thu Aug 24 10:48:05 CST 2017, 1503542885955

即上述程序执行的时刻是2017年8月24日10点48分05秒,该时刻距离1970年1月1日0点经过了1503542885955毫秒。反过来说,输出的年月日时分秒其实是根据这个毫秒数来反算出来的。

 

时区的概念

全球分为24个时区,相邻时区时间相差1个小时。比如北京处于东八时区,东京处于东九时区,北京时间比东京时间晚1个小时,而英国伦敦时间比北京晚7个小时(英国采用夏令时时,8月英国处于夏令时)。比如此刻北京时间是2017年8月24日11:17:10,则东京时间是2017年8月24日12:17:10,伦敦时间是2017年8月24日4:17:10。调用Date对象getTime()方法就可以返回这个毫秒数。

 

Date的时区无关性

既然Date里存放的是当前时刻距1970年1月1日0点时刻的毫秒数,如果此刻在伦敦、北京、东京有三个程序员同时执行如下语句:

Date date = new Date();

那这三个date对象里存的毫秒数是相同的吗?还是北京的比东京的小3600000(北京时间比东京时间晚1小时,1小时为3600秒即3600000毫秒)?答案是,这3个Date里的毫秒数是完全一样的。

确切的说,Date对象里存的是自格林威治时间( GMT)1970年1月1日0点至Date对象所表示时刻所经过的毫秒数。所以,如果某一时刻遍布于世界各地的程序员同时执行new Date语句,这些Date对象所存的毫秒数是完全一样的。也就是说,Date里存放的毫秒数是与时区无关的。

 

 

Date 与  Sting 格式互转:

package utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

/**
 * Date 和  String
 * 关于时间的格式,在应用中一般用 Stirng 和 Date 来表示,
 *
 * Date--> String 没有时区的概念,Date中的内容都是 国际的,当getHour() toString() 等方法时,
 * 通过 获取本地的时区对Date进行格式转换再输出
 * 
 * String --> Date 时,传递的 String,默认是本地的时区时间,如果传递的参数不是本地时区时间时,
 * 在转换为 Date时,需要指定时区
 */
public class Test_TimeZone {

	public static void main(String[] args) throws ParseException {
		
		Date date = new Date();
		System.out.println(date.getTime());  // 全球统一值
		System.out.println(date.toString()); // toString的时候获取本地时区,做了时间转换,并不是Date的真实时间
		System.out.println();
		
		String date_str_1 = format(date);
		System.out.println(date_str_1);
		
		Date date_1 = parse(date_str_1);
		System.out.println(date_1.toString());
	
		/*  查看 支持的 TimeZone
		String[] ss = TimeZone.getAvailableIDs();
		for (String string : ss) {
			if (string.indexOf("GMT") > 0) {
				System.out.println(string);
			}
		}
		*/
	}
	
	/**
	 * 日期格式转字符串   (Date -- > String)
	 * Date 转字符串,格式随便定义都可以
	 */
	public static String format(Date date) throws ParseException {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		//df.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
		df.setTimeZone(TimeZone.getTimeZone("GMT")); // 国际时间,决定输出的 String 是国际格式

		return df.format(date);
	}
	/**
	 * 字符串转日期格式    (String --> Date)
	 */
	public static Date parse(String s) throws ParseException {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//df.setTimeZone(TimeZone.getTimeZone("GMT+8"));
		//df.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8")); 
		df.setTimeZone(TimeZone.getTimeZone("GMT")); // 指定参数 String为国际格式,输出时,按本地时区输出
		
		return df.parse(s);
	}
}

 

将 某个时区 的 String 格式 转换为 另一个时区的 String 格式

package utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Test_Time {

	public static void main(String[] args) throws ParseException {
		parse_format();
	}
	/**
	 * 将 某个时区的 String 的格式 转换为 另一个时区的 String 格式 
	 * @throws ParseException
	 */
	public static void parse_format() throws ParseException {

		String timeStr = "2017-8-24 11:17:10";
		/* 
		 * 一般是通过 Date 转换过来的,Date 转换到 String 的时候 需要指定时区,所以得到的String是有时区的
		 * (当你此刻输入一个 String 格式的时间时,这个String一定是有时区的,所以 要深刻理解 String 是有时区的,
		 *  任何时候需要操作该值的时候,都要指定 String 代表的时区)
		 */
		
		SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		bjSdf.setTimeZone(TimeZone.getTimeZone("GMT"));  
		/*
		 *  指定 字符串的时区
		 *  将字符串时间按 国际时间 解析成Date对象
		 *  (因为你通过其他地方获取的 String 是国际时间格式,所以按照国际时间转换)
		 */
		Date date = bjSdf.parse(timeStr); 
		System.out.println(date.getTime());   
		/*  
		 * 如果你获取的 是 本地的字符串时间,那就需要按照 本地的 时区转换,
		 * 转换成功之后,获取的Date都是国际格式,但是在 toString的时候,会默认按本地时区输出,但是输出内容并不是国际时间,
		 *
		 * 但getTime()是统一的,所以我们认为 Date 没有时区的概念,任何的输出操作都会先获取本地时区,将国际时间格式的Date,按本地时区输出。(输出内容不可信)
		 */ 
		SimpleDateFormat tokyoSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 东京
		tokyoSdf.setTimeZone(TimeZone.getTimeZone("Asia/Tokyo")); // 设置东京时区
		System.out.println("国际时间: " + timeStr + " 对应的东京时间为:" + tokyoSdf.format(date));
		/*
		 *  输出:
		 *    1503573430000
		 *    国际时间: 2017-8-24 11:17:10 对应的东京时间为:2017-08-24 20:17:10
		 * */
	}

}

 

我觉得这两个例子,应该就能说明大部分问题了,

深刻理解 Date 没有时区的概念,任何的输出信息都是根据本地时区来输出的。

任何一个 String 格式的字符串都有相对应的时区,因为任何的String都是通过 new Date() 和  format() 转换过来的,即使没有写时区,当时默认也获取了本地时区。所以,Sting 一定有对应的时区。

 

 

参考博客:

https://blog.youkuaiyun.com/halfclear/article/details/77573956

https://www.cnblogs.com/softidea/p/8612287.html

 

 

 

 

【Java基础知识 29】Java Date类详解 Calendar类的功能要比Date类强大很多,可以方便的进行日期的计算,获取日期中的信息时考虑了时区等问题。而且在实现方式上也比Date类要复杂一些。 阅读详情

相关推荐

date-time-string:日期时间字符串

-npm 安装: $ npm install date-time-string 或者 < script src =" http://lightspeedworks.github.io/date-time-string/date-time-string.js " > </ script > 用法: 简单的功能 var DateTime = require ( 'date-time-string' ) ; console . log ( DateTime . toDateTimeString ( ) ) ; // 2014-12-15 21:58:56.450 console . log ( DateTime . toDateString ( ) ) ; // 2014-12-15 console . log ( DateTime . toTimeString ( ) )

Java格式化获取时间Date,String类型

java获取当前时间

波哥软件库 2866

VASP计算层错能(SFE)全攻略2

本文介绍了使用VASP计算纯镍(Ni)层错能(SFE)的具体步骤。首先构建Ni的FCC单胞并扩展为超胞,通过修改原子位置引入堆垛层错;随后分别计算完美晶体和含层错结构的能量;最后通过能量差与层错面积之比求得SFE值。计算需注意k点网格、截断能和超胞尺寸的收敛性测试,并推荐使用PAW赝势和ASE等工具辅助结构构建。

weixin_50519490的博客 1986

后台实体日期类型是string,前端传递时间之类型转换

当实体对应的日期类型是string时,如果不做处理,前端传递到后台的时间将会被转换成类似“Aug 21 2018 00:00:00 GMT+0800 (中国标准时间)”格式的字符串 这种格式的字符串使用SimpleDateFormat类并不能直接转换,类型不对,当然可以使用字符串截取的方式去转换,这种方式并不是这篇文章介绍的重点 字符串截取后转换的方式: public final static String FORMAT_STRING = "yyyy-MM-dd HH:mm:ss"; p.

一步一个脚印_binding 1803

Frida提取Cocos游戏XXTEA密钥的实战方法论

XXTEA是一种轻量级分组加密算法,广泛用于移动端游戏通信保护;其128位密钥的安全性直接决定网络协议逆向成败。在Cocos引擎生态中,密钥常以静态常量、JNI动态传递或Native运行时派生三种形态存在,导致传统静态分析失效。Frida凭借跨Java/Native注入能力与内存实时观测优势,成为捕获密钥‘出生瞬间’的关键工具——尤其适用于hook xxtea_encrypt函数入口、监控JNI参数传递、设置内存断点追踪派生过程等场景。本文聚焦Cocos2d-x与Cocos Creator项目,覆盖从密钥识

weixin_33509600的博客 416

宇树G1嵌入式软件架构及技术实现

该架构通过硬件加速(FPGA)+确定性调度(RTX5)的组合,在1ms控制周期内完成从传感器采集到43轴输出的全链路处理,相比波士顿动力系统缩短40%的着地稳定时间。,结合ARM Cortex-R5与FPGA的异构计算能力,实现43自由度1kHz实时控制。

m0_60674045的博客 4311

Java:String和Date、Timestamp之间的转换

一、String与Date(java.util.Date)互转        1.1 String -&gt; Date   String dateStr = "2010/05/04 12:34:23"; Date date = new Date(); //注意format的格式要与日期String的格式相匹配 DateFormat sdf = new SimpleDa...

yunnick的专栏 1517

保姆级教程:用C++逆向解析通达信shm.tnf文件(附完整代码与偏移量详解)

本文提供了一份详细的C++逆向工程教程,指导开发者如何解析通达信的shm.tnf文件。通过分析文件结构、定位关键字段并实现完整解析流程,帮助量化交易开发者高效获取沪市股票数据。教程包含完整代码示例和偏移量详解,适合金融数据本地化处理需求。

weixin_27945229的博客 523

String Date Timestamp 三种日期格式的转换

String  Date  Timestamp 三种日期格式的转换 一、将指定格式的String转换为Date /** * 将指定日期格式的String转换为Date */ String s_time = "2010-08-08 06:06:06"; SimpleDateFormat dateFormat = new SimpleDateFo

u010124396的专栏 3169

Index-TTS-1.5:多模态语音合成的技术演进与商业落地实践

本文深入探讨了Index-TTS-1.5在多模态语音合成领域的技术演进与商业落地。该模型基于GPT风格的自回归Transformer架构,通过优化条件编码器和引入字符-拼音混合建模,显著提升了语音生成的稳定性、精准度和真实感,实现了高质量的零样本语音克隆。文章还详细介绍了其云端体验、本地WebUI部署及ComfyUI集成等实战路径,并分析了其在虚拟数字人、个性化内容创作等商业场景中的应用潜力与挑战。

weixin_29098367的博客 401

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.youkuaiyun.com/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

带时区String类型时间转Date类型

调用接口, 得到的时间是以下格式的: String time = “2018-08-13T15:58:35+0800”; 使用工具类进行转换 public static Date TzFormat(String oldDate)throws ParseException{ Date date1 = null; DateFormat df = new ...

weixin_39793573的博客 4540

【图像超分】论文复现:CVPR 2024 | 轻量化超分 | 窗口注意力改进 | CAMixerSR的Pytorch源码复现,跑通源码,获得指标和超分结果,计算复杂度,架构梳理拆解,逐行注释!

本文介绍了超分辨率重建方法CAMixerSR的代码实现与运行指南。文章亮点包括:完整跑通源码获取PSNR/SSIM指标和可视化结果;详细解析模型架构与关键代码注释,帮助快速复现基线模型。实验部分提供了测试配置文件和训练设置说明,支持2K/4K/8K大图像超分和x2/x4轻量化超分。环境依赖PyTorch和BasicSR框架,数据集包含DIV2K等常用基准。测试结果与论文指标一致,可视化输出保存至指定目录。训练配置可自定义数据集路径、GPU数量等参数。该实现突出了CAMixerSR在降低W-MSA复杂度方面的

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 438

string-date-instant 时间类型转换

instant.tostring 得到的是带有T 的时间格式 Date data = Date.from(instant); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String s = simpleDateFormat.format(date); s的时间格式 202...

yang_zzu的博客 7700

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之BswM模块配置详解(上)

weixin_42412049的博客 739

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Date、LocalDateTime 、String等时间数据之间的转换

Date、LocalDateTime 、String等时间数据的转换及获取

weixin_43898002的博客 822

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

localdate转date时区问题,Joda时间:如何将String转换为LocalDate?

How to specify the format string to convert the date alone from string. In my case, only the date part is relevantConstructing it as DateTime fails:String dateString = "2009-04-17";DateTimeFormatter f...

weixin_33583419的博客 303

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java8 日期Date、LocalDate、LocalDateTime、DateTime、字符串String的转换

【代码】java8 日期Date、LocalDate、LocalDateTime、字符串String的转换。

Cyms,BgXmSfXtsj !!!! Battle Each Moment !!!! 859

【数仓】Hive/Spark 时间类型全攻略:时间戳、字符串、DATE 怎么选、怎么转、怎么避坑

本文系统梳理了数仓中时间字段的四种常见形态(日期、日期时间、时间戳、字符串)及其适用场景,强调分区字段用 STRING、ODS 层保留原始格式、精确时刻统一使用毫秒戳或 TIMESTAMP。重点讲解了 unix_timestamp、from_unixtime、to_date、cast、date_format 等核心转换函数的用法与陷阱,涵盖时区影响、格式规范、类型兼容等问题,并总结了时间加减、差值计算与粒度截断的实用写法,帮助开发者规避因时间处理不当导致的数据错误与任务失败。

zy123456nn的博客 337

Java中LocalDateTime的使用

Java中LocalDateTime使用 文章目录Java中LocalDateTime使用1. 简介2. LocalDateTime用法2.1 获取当前的时间2.2 根据年月日格式化时间2.3 获取时区东八区的时间2.4 从LocalDateTime中获取年月日等时间信息2.5 从LocalDateTime中获取LocalDate与LocalTime2.6 日期计算2.7 获取某天的整点时间,通过with修改值2.8 获取毫秒值3. LocalDateTime与Date、String互转3.1 LocalD

mingyonghu的博客 1万+

解决因时区导致数据库存储时间与前台显示相差一天问题

但是数据库存储时间是2023-11-08,前台显示2023-11-07,返给前端的数据也是2023-11-07。这是因为时区不一致导致的,我本地是正常的,但是线上的不对,才发现是时区导致的。@JsonFormat注解里加 timezone = "GMT+8"1.数据库字段类型是date类型,VO类也是date类型。2.VO类的Date类型改为String类型。试了两种解决办法都可以实现。这样前后端时间就一致了。

m0_58439598的博客 579

java——date时间类型操作

简单总结java.util.Date类的使用,包括初始化,获取时间,与String类型转换以及时间先后比较;并简单总结java9新的时间框架localDateTime

tang_seven的博客 3980

国际标准时间(前台)和年月日时差为8个小时,如果使用String得到的日期会少八小时

/修改后:国际标准时间(前台)和年月日时差为8个小时,如果使用String 得到的日期会少八小时。问题:国际标准时间(前台)和年月日时差为8个小时,如果使用String得到的日期会少八小时。@ApiModelProperty(value = "上传日期(起),查询用")@ApiModelProperty(value = "上传日期(起),查询用")北京时间比世界时间早8小时标准时间)//修改前,会发现获取的时间比预想的时间少八小时。当然也可以使用两个时间转换方法解决。如果后台使用以下来接收前台代码。

qq_40453972的博客 822

Date、LocalDateTime、String和时间戳Long之间的互相转换

public class DateUtils { public static void main(String[] args) { //LocalDateTime转时间戳 //获取秒数 long second = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")); System.out.println(second); //获取毫秒数 lon.

qq_50889632的博客 3060

前后端时间传递之注解

前后端进行数据交互时,对于时间总会出现问题,今天我们来总结一下这么解决。

2301_78658028的博客 913

【Java 时间处理终极指南】从 JDK 8 到 JDK 17:DateTimeUtils 工具类全解析与实战

统一工具类:将抽取到公共依赖 Jar,避免多模块复制导致版本不一致。MyBatis 支持:MyBatis 3.4+ 版本已经原生支持,数据库驱动只要支持 JDBC 4.2 即可,无需额外配置。敏感业务:涉及支付、对账等跨时区业务,建议数据库存储Instant或Long,避免时区转换带来的歧义。JDK 17 迁移:上述代码在 JDK 17 中完全兼容且运行效率更高。JDK 17 主要是底层优化和 API 的进一步精简(如的不可变性增强),业务代码层面无需大改。

qq_52158153的博客 225
上一篇: 【数据结构】关于树,我们应该知道什么
下一篇: 【多线程】理解多线程(一)
jy0921_
博客等级 码龄11年 329粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值