Java 获得时区,获得UTC时间

4 篇文章 0 订阅

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;
       }
   }

}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java处理UTC时间主要依赖于Java标准库中的java.time包。在Java 8及以上版本中,该包被大幅升级,提供了更加方便的方式来处理日期和时间。以下是使用Java进行UTC时间解析的简单步骤: 1. 使用Instant类将UTC时间转换为Java的默认时区时间 使用java.time.Instant类可以将UTC时间表示为类似于时间戳的方式,其包含“自1970年1月1日零时零分零秒(UTC)”的毫秒数。我们可以使用Instant类将UTC时间转换为Java默认时区下的对应时间。示例代码如下: ``` String utcTime = "2022-08-08T08:08:08.123Z"; Instant instant = Instant.parse(utcTime); ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault()); ``` 这里我们首先创建了一个字符串类型的UTC时间,然后使用Instant的静态方法parse将其转换为Instant类型的对象。接着,我们使用Instant对象的atZone方法将其转换为ZonedDateTime类型的对象,其中默认时区使用系统默认时区。 2. 格式化输出 如果想要将ZonedDateTime对象按照特定的格式输出为字符串,可以使用DateTimeFormatter类。示例代码如下: ``` DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); String localTime = zdt.format(formatter); ``` 在这里,我们首先创建了一个DateTimeFormatter对象,指定了输出字符串的格式。然后使用ZonedDateTime的format方法将其按照指定格式输出为字符串类型的本地时间。 总之,Java提供了丰富的类库和方法,使得在处理UTC时间时非常方便。在实际应用中,还需要考虑到时区以及夏令时等问题,以确保转换结果的正确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值