如何使用Java获得时区及UTC时间呢?
下文笔者讲述使用java代码获取时区信息及UTC时间的方法分享,如下所示
时区简介
时区是我们根据每个地区所在的经度,划分的时间 整个地球正式时区分为24个时区 分为使用24个英文字母表示 每个15经度划一个时区 例: GMT属于z区 其时间后面会加一个后缀Z
UTC时间简介
UTC指世界统一时间 也叫世界标准时间、国际协调时间 协调世界时是以原子时秒长为基础 在时刻上尽量接近于世界时的一种时间计量系统
Java获取时区的方法
实现思路:
Java涉及时区的类
有ZoneId和TimeZone
ZoneId:通过一些位置信息来获取时区信息
使用ZoneId,来创建TimeZone对象
再使用TimeZone对象
创建Calendar对象
例:
package com.java265;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.TimeZone;
@SuppressWarnings({ "static-access", "unused" })
public class TestZoneId {
public static void main(String[] args) {
System.out.println(TimeZone.getDefault());
for (String string : ZoneId.SHORT_IDS.keySet()) {
String id = ZoneId.SHORT_IDS.get(string);
ZoneId zoneId = ZoneId.of(id);
testSetZone(zoneId);
// printMessage(zoneId);
}
// testCalendar();
}
/**
* 打印一些基本信息
*/
/*private static void printMessage(ZoneId zoneId) {
// ZoneId zoneId = ZoneId.systemDefault();
TimeZone timeZone = TimeZone.getTimeZone(zoneId);
System.out.println(timeZone);
System.out.println(zoneId);
Set<String> availableZoneIds = zoneId.getAvailableZoneIds();
ZoneRules rules = zoneId.getRules();//standardOffsets [+08:05:43, +08:00]
ZoneOffset standardOffset = rules.getStandardOffset(Instant.now());//获得标准偏移量
System.out.println(standardOffset);//+08:00 totalSecond 28800 秒 28800000 毫秒
System.out.println(rules);
}*/
/**
* 指定时区或设置默认时区
*/
public static void testSetZone(ZoneId zoneId){
// ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("ECT"));
// TimeZone timeZone = TimeZone.getDefault();
TimeZone timeZone2 = TimeZone.getTimeZone(zoneId);
System.out.println("zoneId:"+zoneId);
// System.out.println(timeZone);
System.out.println("timeZone2:"+timeZone2);
Calendar calendar = Calendar.getInstance(timeZone2);
System.out.println("zone_offset:" + calendar.get(Calendar.ZONE_OFFSET));
System.out.println("dst_offset:" + calendar.get(Calendar.DST_OFFSET));
}
}
注意事项:
java8中定义ZoneId.SHORT_IDS集合拿出来遍历
发现时区偏移量ZONE_OFFSET在东半球为正数
在西半球为负数
dst_offset 夏时令偏移量
大部分时候为0
由于可以根据时区偏移量和夏时令偏移量来进行本地时间和UTC 时间的转换
例:
package com.java265; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class getUTCTime { /** * 获得世界协调时的近似值 * @return Date */ public static Date getUTCTime(){ Calendar cal = Calendar.getInstance(); //获得时区和 GMT-0 的时间差,偏移量 int offset = cal.get(Calendar.ZONE_OFFSET); //获得夏令时 时差 int dstoff = cal.get(Calendar.DST_OFFSET); cal.add(Calendar.MILLISECOND, - (offset + dstoff)); return cal.getTime(); } /** * 获得世界协调时的近似值 * @param format 格式化的时间格式 * @return String */ public static String getUTCTime(String format){ String formatDate = format(getUTCTime(), format); return formatDate; } /** * 根据传入得本地时间获得 获得 这个对应得UTC 时间 * @param LocalDate * @param format * @return */ public static String getUTCTimeByLocalTime(String localDate,String format){ Calendar cal = Calendar.getInstance(); //获得时区和 GMT-0 的时间差,偏移量 int offset = cal.get(Calendar.ZONE_OFFSET); //获得夏令时 时差 int dstoff = cal.get(Calendar.DST_OFFSET); Date date = new Date(getMillSecond(format, localDate) - (offset + dstoff));//获得当前是UTC时区的时间毫秒值 String formatDate = format(date, format); return formatDate; } /** * 根据utc时间的字符串形式,获得当前时区的本地时间 * @param utcTime 时间字符串形式 * @param format 时间格式为:yyyyMMddHHmmssS 精确到毫秒值 * @return */ public static Date getLocalZoneTime(String utcTime,String format){ Calendar cal = Calendar.getInstance(); //获得时区和 GMT-0 的时间差,偏移量 int offset = cal.get(Calendar.ZONE_OFFSET); //获得夏令时 时差 int dstoff = cal.get(Calendar.DST_OFFSET); //cal.add(getMillSecond(format, utcTime),+(offset + dstoff)); Date date = new Date(getMillSecond(format, utcTime) + (offset + dstoff));//获得当前是时区的时间毫秒值 return date; } /** * 根据utc时间的字符串形式,获得当前时区的本地时间 * @param utcTime 时间字符串形式 * @param format 时间格式为:yyyyMMddHHmmssS 精确到毫秒值 * @return */ public static String getLocalZoneTimeString(String utcTime,String format){ return format(getLocalZoneTime(utcTime, format),format); } /** * 根据时间的字符串形式获得时间的毫秒值 * @param format 最好为yyyyMMddHHmmssS 精确到毫秒值,这样转换没有精度损失 * @return */ public static long getMillSecond(String format,String time){ Date parse = parse(time, format); return parse.getTime(); } /** * 使用用户格式格式化日期 * @param date 日期 * @param pattern 日期格式 * @return */ public static String format(Date date, String pattern) { String returnValue = ""; if (date != null) { SimpleDateFormat df = new SimpleDateFormat(pattern); returnValue = df.format(date); } return (returnValue); } /** * 使用用户格式提取字符串日期 * @param strDate 日期字符串 * @param pattern 日期格式 * @return */ public static Date parse(String strDate, String pattern) { SimpleDateFormat df = new SimpleDateFormat(pattern); try { return df.parse(strDate); } catch (ParseException e) { e.printStackTrace(); return null; } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


