Java 获得时区,获得UTC时间
Java 获得时区相关的类,主要是ZoneId,还有TimeZone(这个信息详细一点)
ZoneId 主要是通过列表选定了一些规定位置,然后通过这些位置代表的时区,来划分时区,例如 中国就是Asia/Shanghai
然后根据时区,我们可以根据 ZoneId ,来创建TimeZone 对象,再有 TimeZone 对象 来创建Calendar 对象
测试代码如下:
package test.time;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.TimeZone;
/**
* 测试java 时区相关
* @author 12198
*
*/
@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));
}
}
把java 8中定义的 ZoneId.SHORT_IDS 集合拿出来遍历,可以发现时区偏移量 ZONE_OFFSET 在东半球为正数,在西半球为负数,dst_offset 夏时令偏移量 ,大部分时候为0,由于可以根据时区偏移量和夏时令偏移量来进行本地时间和UTC 时间的转换
转换方法如下:
package test.time;
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;
}
}
}
还没有评论,来说两句吧...