TimeZone.getTimeZone 获取中国北京时间
时间: 2023-06-28 22:09:59 浏览: 219
可以使用如下代码获取中国北京时间:
```
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
Calendar calendar = Calendar.getInstance(timeZone);
Date date = calendar.getTime();
```
其中,`TimeZone.getTimeZone("Asia/Shanghai")` 用于获取中国北京时区的 `TimeZone` 对象,`Calendar.getInstance(timeZone)` 用于根据该时区创建 `Calendar` 对象,`calendar.getTime()` 返回该 `Calendar` 对象表示的时间,即中国北京时间。
相关问题
java 存入数据库时间差8小时
存入数据库时间差8小时的问题通常是由于时区设置不正确导致的。在Java中,使用new Date()获取的时间是根据JVM默认的时区来确定的,而JVM默认使用的是0时区的时间,与北京时间相差8小时。当将数据存入数据库时,数据库服务器会将本地时间转换为服务器所对应的时区,即0时区,所以会再次相差8小时。当返回给前端时,如果使用了Spring Boot的@RestController或@Controller+@ResponseBody注解,返回值会被默认的Jackson框架转换为Json格式,而Jackson框架默认的时区是GMT,相对于中国是少了8小时,所以最终返回到前端的结果会相差8小时。解决这个问题的方法有两种:
1. 手动设置JVM时间:将时间改为第8时区的时间,可以使用以下代码进行设置:
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
2. 在配置数据库的URL上加上"serverTimezone"参数,确保存入数据库的时间是正确的。例如:
jdbc:mysql://localhost:3306/datasource?serverTimezone=GMT%2B8
同时,还需要确认配置了Jackson的"time-zone"参数,确保给前端返回的时间是正确的。例如:
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
需要注意的是,如果只是手动设置JVM时间,而JVM仍然是后台0时区的时间,那么在后台执行逻辑时仍然会出现时间相差8小时的问题。因此,建议使用第一种方法,直接将整个JVM改为北京的8时区。总结起来,这个问题的根本原因是时区设置不正确。\[1\]\[2\]\[3\]
#### 引用[.reference_title]
- *1* *3* [java获取时间相差8小时的问题及解决方式](https://blog.csdn.net/qq_42031483/article/details/100625564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [springboot + 数据库时间差8小时](https://blog.csdn.net/gulang00/article/details/130501650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
Java 中使用SimpleDateFormat 的format 将字符串的1986年4-7月份得出的时间格式为什么有时候是东9区
在Java中,`SimpleDateFormat` 是用于解析和格式化日期和时间的对象。当你使用 `format()` 方法将特定日期转换为字符串时,输出的时间格式通常会基于当前系统的默认时区设置。如果你没有显式指定时区,而系统默认为东九区(例如中国北京),那么它就会按照该时区规则显示时间。
如果你的1986年4月至7月的日期是在东九区,`SimpleDateFormat` 没有错误地处理的话,输出应该是正确的东九区时间。然而,如果这个时间段跨越了夏令时的变化点,比如从不需要夏令时到需要的过渡时期,由于夏令时会使时间向前推进一小时,可能会造成看似不连续的时区变化印象。
所以,如果你看到的时间格式有异常,可能是由于夏令时导致的时钟跳动或者系统时区设置的问题。要确保准确一致,你应该明确提供一个固定的时区给 `SimpleDateFormat`,如通过传递 `TimeZone` 对象给它的构造函数:
```java
String pattern = "yyyy年M月";
Date date = ...; // 假设已经获取到1986年4-7月的某一天
TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai"); // 设置为中国东九区
SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.CHINA);
sdf.setTimeZone(timeZone);
String formattedDate = sdf.format(date);
```
阅读全文