好多年不写博客,今日偶上csdn,发现有位哥们发了我数条信息,只为谢我某篇博客帮了他项目的大忙。
年事已高锋芒不在的我,也再度有了一丝激情,希望写点能帮助到大家的东西吧。
这个java 的时区问题是我修复hive 的日期udf 中的问题发现的。
1. 为什么需要设置时区
说起java中的时间,大家或许都很熟悉,朗朗上口的Date、Calendar、SimpleDateFormat等。但是大家对他们的认识真的很深刻吗?今天我要想大家说的是TimeZone,即时区。
经常有人发现时间不对,比如相差8个小时等等,其真实原因便是TimeZone。只有正确合理的运用TimeZone,才能保证系统时间无论何时都是准确的。
影响TimeZone的因素:
1. 操作系统的时区设置。
2. 数据传输时时区设置。
第一个原因其实是根本原因,当数据在不同操作系统间流转时,就有可能因为操作系统的差异造成时间偏差,而JVM默认情况下获取的就是操作系统的时区设置。因此在项目中最好事先设置好时区
否则,可能导致比如下面的问题(不设置时区的时候得到的日期是UTC时间):
2. 如何设置时区
public static void main(String[] args) {
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd");
try {
System.out.println(f1.parse("2015-12-12"));
f1.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
System.out.println(f1.parse("2015-12-12"));
} catch (ParseException e) {
e.printStackTrace();
}
}
Sat Dec 12 08:00:00 CST 2015Sat Dec 12 00:00:00 CST 2015
ps:中国的时区是东八区
3. 时区值大全
{"ACT", "Australia/Darwin"},{"AET", "Australia/Sydney"},
{"AGT", "America/Argentina/Buenos_Aires"},
{"ART", "Africa/Cairo"},
{"AST", "America/Anchorage"},
{"BET", "America/Sao_Paulo"},
{"BST", "Asia/Dhaka"},
{"CAT", "Africa/Harare"},
{"CNT", "America/St_Johns"},
{"CST", "America/Chicago"},
{"CTT", "Asia/Shanghai"},
{"EAT", "Africa/Addis_Ababa"},
{"ECT", "Europe/Paris"},
{"EST", "America/New_York"},
{"HST", "Pacific/Honolulu"},
{"IET", "America/Indianapolis"},
{"IST", "Asia/Calcutta"},
{"JST", "Asia/Tokyo"},
{"MIT", "Pacific/Apia"},
{"MST", "America/Denver"},
{"NET", "Asia/Yerevan"},
{"NST", "Pacific/Auckland"},
{"PLT", "Asia/Karachi"},
{"PNT", "America/Phoenix"},
{"PRT", "America/Puerto_Rico"},
{"PST", "America/Los_Angeles"},
{"SST", "Pacific/Guadalcanal"},
{"VST", "Asia/Saigon"}