1. 程式人生 > >關於java時區轉換夏令時問題及解決辦法

關於java時區轉換夏令時問題及解決辦法

關於中國的夏令時問題:參考另外一篇:

http://mp.blog.csdn.net/postedit/78924498

這裡:主要講的是: 在夏令時結束的時候,java會提前一個小時變化

如:2016年美國夏令時:3.13-11.6  

正常變化點:紐約時間2016-3-13 2:00:00開始 (變成3點)-->紐約時間2016-11-6 2:00:00(變成1點)結束夏令時

實際呢:在2016-11-6   1:00就發生了變化

一.準備知識

1.America/New_York的夏令時時間如下: 包左不包右

2016-3-13, 02:00:00到2016-11-6, 02:00:00 
2017-3-12, 02:00:00到2017-11-5, 02:00:00

2.三字母時區 ID

為了與 JDK 1.1.x 相容,一些三字母時區 ID(比如 "PST"、"CTT"、"AST")也受支援。
但是,它們的使用被廢棄,這是因為相同的縮寫經常用於多個時區
例如 CST:有4個意思,美國,澳大利亞,中國,古巴時間

3.標準

GMT:Green Mean Time格林威治標準時間,1960年前被作為標準時間參考   GMT+12-->GMT-12       

        java8的範圍為GMT+18-->GMT-18
UTC:Coordinated Universal Time 時間協調世界時間 ,比GMT精確,在1972年1月1日成為新的標準;UTC,UTC+1,UTC+2...UTC+12,UTC-12...UTC-1

       java8的範圍 UTC-18-->UTC+18
DST:Daylight Saving Time 夏令時間,指在夏天的時候,將時鐘撥快一個小時,以提早日光的使用,在英國稱為夏令時間;

目前有110多個國家採用夏令時;
在中國,從1986-1992只實行了6年,之後就取消了;原因如下:
   1.中國東西方向跨度很大,而且採用的是統一的東八區,採用夏令時無法相容東西部;
   2.高緯度地區,冬夏晝夜時間變化大;意義不大;

4.表示東八區可以用 : GMT+8或者Etc/GMT-8(剛好相反,為什麼呢,因為php開發者認為,東八區比標準時間快8小時,應該減去8小時,於是表示成了這樣。參考的物件不同導致了不同的表示方法;)

5. 中國時區的表示方式

    GMT+8

    UTC+8

     Asia/Harbin 哈爾濱     //中國標準時間
     Asia/Chongqing 重慶//中國標準時間
     Asia/Chungking 重慶//中國標準時間
     Asia/Urumqi 烏魯木齊//中國標準時間
     Asia/Shanghai  上海(東8區)//中國標準時間
     PRC
     Asia/Macao 澳門  //中國標準時間
     Hongkong       香港     //香港時間跟中國標準時間一致
     Asia/Hong_Kong 香港   
     Asia/Taipei 臺北(臺灣的) //中國標準時間
     新加坡跟中國的時間一樣;
     Asia/Singapore  
     Singapore  

6.  標準時區的表示

    UTC

    UTC+0

    UTC-0

    GMT 格林尼治標準時間
    GMT0 格林尼治標準時間
    Etc/GMT 格林尼治標準時間
    Etc/GMT+0 格林尼治標準時間
    Etc/GMT-0 格林尼治標準時間
    Etc/GMT0 格林尼治標準時間

    注意:GMT+xx(-xx)有很大的包容性,還可以自動的識別各種時間的表示

二. 時區轉換

環境:java8之前

1.將當前時間轉換為指定時區顯示

 @Test
	public void test() throws Exception {
    	Date a=new Date();
    	SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	sf.setTimeZone(TimeZone.getTimeZone("America/New_York"));
    	//把中國時區轉為了美國紐約時區
    	System.out.println(sf.format(a));
	}
2.指定時間轉為指定時區顯示

   真能正確轉換嗎?好像有個坑,看了看網上的實現

   關於夏令時,感覺有點問題

 //實現方式1 沒有考慮夏令時
    @Test
	public void test2() throws Exception {
//    	Date dateTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 14:00:00");
    	Date dateTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-10-6 14:00:00");
    	TimeZone zhong = TimeZone.getTimeZone("GMT+8:00");//中國
    	TimeZone york = TimeZone.getTimeZone("America/New_York"); //GMT-5
    	//這裡的時區偏移量是固定的,沒有夏令時,錯
    	long chineseMills = dateTime.getTime() +   york.getRawOffset()-zhong.getRawOffset();
    	Date date = new Date(chineseMills);
    	System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
	}


 //實現方式2 你可能回想,用Calendar類的Calendar.DST_OFFSET
    //還是不對Calendar.DST_OFFSET這個是死的
	@Test
	public void test3() throws Exception {

//		Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 14:00:00");
//		Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 1:00:00");
//		Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 0:59:00");
//		Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 1:59:59");
		Date time =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-11-6 3:00:00");
	
		// 1、取得本地時間:
		Calendar cal = Calendar.getInstance();
		cal.setTime(time);
		cal.setTimeZone(TimeZone.getTimeZone("America/New_York"));
		// 2、取得時間偏移量:這個是固定的
		int zoneOffset = cal.get(Calendar.ZONE_OFFSET)/(1000*60*60);
		// 3、取得夏令時差:這個是固定的,不是根據時間動態判斷,只要時區存在夏令時,就是1
		int dstOffset = cal.get(Calendar.DST_OFFSET)/(1000*60*60);
		
		System.out.println(zoneOffset);
		System.out.println(dstOffset);
		// 4、從本地時間裡扣除這些差量,即可以取得UTC時間:
//		cal.add(Calendar.MILLISECOND, -(zoneOffset + dstOffset));
		cal.add(Calendar.HOUR, -(zoneOffset + dstOffset));
		Date time2 = cal.getTime();
		System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2));
		}

       //實現方式3 準備工作
       // 不是說java會自動替我們處理夏令時嗎
	//先來個簡單的測試,看夏令時判斷方法是否是正確,就可以推斷,java的自動處理是否正確
	//已知2016年:America/New_York的夏令時時間是:  2016-3-13 02:00:00  到  2016-11-06 01:59:59 
        @Test
   	public void test4() throws Exception {
    	//轉換為0時區時間作為參照點
    	SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    	sf.setTimeZone(TimeZone.getTimeZone("GMT+0"));
//       	Date dateTime=sf.parse("2016-11-6 5:59:59");
    	Date d1=sf.parse("2016-03-13 6:59:59");//false 
       	Date d2=sf.parse("2016-03-13 7:00:00");//true 
       	Date d3=sf.parse("2016-11-6 6:59:59");//false  
       	Date d4=sf.parse("2016-11-6 7:00:00");//false
       	//現在發現了,對於夏令時開始的時間判斷確實沒問題,但是對於夏令時的結束時間判斷錯誤,準確說,提前了一個小時判斷了
       	//看下面驗證就知道了,那麼為什麼提前了一個小時,不知道,怎麼解決? 目前想到的只能用java8
        d3=sf.parse("2016-11-6 5:59:59");//true  
        d4=sf.parse("2016-11-6 6:00:00");//false  
        TimeZone york = TimeZone.getTimeZone("America/New_York"); //GMT-5
       	
        System.out.println("目標時區是否使用了夏令時:"+isDaylight(york, d1));
        System.out.println("目標時區是否使用了夏令時:"+isDaylight(york, d2));
        System.out.println("目標時區是否使用了夏令時:"+isDaylight(york, d3));
        System.out.println("目標時區是否使用了夏令時:"+isDaylight(york, d4));
   	}
    
    //判斷是否在夏令時
    private boolean isDaylight(TimeZone zone,Date date) {
		return zone.useDaylightTime()&&zone.inDaylightTime(date);
    }
 //實現方式3 
    //通過上面的驗證我們知道了系統的判斷是有問題的,通過設定時區,程式自動處理夏令時也不是那麼正確,起碼我現在無法理解為什麼
        @Test
	public void test5() throws Exception {
    	//中間相隔13個小時     中國+8  紐約-5
    	ChangeZone("2016-3-13 14:59:59", "PRC","America/New_York",  "yyyy-MM-dd HH:mm:ss");//2016-03-13 01:59:59
    	ChangeZone("2016-3-13 15:00:00", "PRC","America/New_York",  "yyyy-MM-dd HH:mm:ss");//2016-03-13 03:00:00
    	ChangeZone("2016-11-6 13:59:59", "PRC","America/New_York",  "yyyy-MM-dd HH:mm:ss");//2016-11-06 01:59:59
        //這個結果是不對的,應該02:00:00
        ChangeZone("2016-11-6 14:00:00", "PRC","America/New_York",  "yyyy-MM-dd HH:mm:ss");//2016-11-06 01:00:00
    }
 	//具體的實現如下:
    //思路是沒問題的
    public static void ChangeZone(String time, String srcID, String destID,
    	  String pattern) throws ParseException {
    	  //設定預設時區
          TimeZone zone = TimeZone.getTimeZone(srcID);
    	  TimeZone.setDefault(zone);
    	  Date  date = new SimpleDateFormat(pattern).parse(time);
    	//設定目標時區
    	TimeZone destzone = TimeZone.getTimeZone(destID);
    	SimpleDateFormat sdf = new SimpleDateFormat(pattern);
    	//設定要格式化的時區
    	sdf.setTimeZone(destzone);
    	String changTime = sdf.format(date);
    	// 獲取目標時區
    	System.out.println("修改時區後" + destzone.getID() + "的時間:" + changTime);
        }
小結:以上的三種實現方式得到的結果對夏令時都有點問題

三,java8的實現

1.先看看java8的支援時區變化

//jdk8的可用時區
	@Test
	public void testName1() throws Exception {
		//jdk8的所有時區
		Set<String> ids = ZoneId.getAvailableZoneIds();
		String[] id1 = ids.toArray(new String[ids.size()]);
		String idss = Arrays.toString(id1).replace("]", ",]");
		
		System.out.println(ids.size());//少了28個    595
		
		//jdk8之前的所有時區
		String[] id2 = TimeZone.getAvailableIDs();
		System.out.println(id2.length);    //623
	
		//找出沒jdk8中沒有的
		for (String id : id2) {
			if (!idss.contains(id+",")) {
				System.out.print(id+",");
			}
		}
		
		//結論:jdk8裡面的所有時區,在之前 全部都有
		//jdk8刪除的時區如下:
		//都是一些容易引起歧義的時區表示方法
//		 EST, HST, MST, ACT, AET, AGT, ART, AST, BET, BST, CAT, CNT, CST, CTT, EAT, ECT, IET, IST, JST, MIT, NET, NST, PLT, PNT, PRT, PST, SST, VST,
		
		// 但是這些短名稱的其實還是可以使用的,只是支援列表裡面沒有了而已
		LocalDateTime date = LocalDateTime.ofInstant(Instant.now(),
				ZoneId.of(ZoneId.SHORT_IDS.get("PST")));
		System.out.println("\nDate = " + date);
		
	}

2.如何新增時區資訊呢,或者說轉換
//LocalDate,LocalDateTime,Instant新增時區資訊
	@Test
	public void testName3()  {
		LocalDate date=LocalDate.now();
		//LocalDate新增時區資訊
		//方式1
		ZonedDateTime zone = date.atStartOfDay(ZoneId.of("GMT+08:00"));
		System.out.println(zone);
		zone = date.atStartOfDay(ZoneId.systemDefault());  
		System.out.println(zone);
		//方式2
	    LocalDate date2 = LocalDate.now(ZoneId.of("GMT+0"));
		System.out.println(date2);
		
		System.out.println("------------------------------------");
		//LocalDateTime新增時區資訊
		LocalDateTime time = LocalDateTime.now();
		//方式1
		ZonedDateTime zonetime = time.atZone(ZoneId.of("GMT+0"));
		//方式2
		ZonedDateTime zonetime2=ZonedDateTime.now(ZoneId.of("GMT+0"));
		//方式3
		LocalDateTime zonetime3 = LocalDateTime.now(Clock.system(ZoneId.of("GMT+0")));
		//方式4
		ZonedDateTime zonetime4 = ZonedDateTime.of(time, ZoneId.of("GMT+0"));
		System.out.println(zonetime); //不變
		System.out.println(zonetime2);//變
		System.out.println(zonetime3);//變
		System.out.println(zonetime4);//不變
		
		System.out.println("------------------------------------");
		
		//Instant時區資訊
		ZonedDateTime atZone = Instant.now().atZone(ZoneId.of("GMT+0"));
		System.out.println(atZone);//變
		
	}
3.如何獲取當前時間的指定時間(測試略)
 //獲取當前時間的指定時區時間,參照點:0時區
		public LocalDateTime getCurrentZoneTime(ZoneId dest) {
			 Objects.requireNonNull(dest);
			 LocalDateTime time2 = LocalDateTime.now(Clock.system(dest));
			 
			 String zoneDesc = getZoneDesc(TimeZone.getTimeZone(dest));
			 System.out.println(dest.getId()+"對應得標準時區:"+zoneDesc);
			 System.out.println("目標時區"+dest+"的時間"+time2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
			 return time2;
		}
//獲取標準時區,方式1
		//在jdk8之前的方法,利用TimeZone
	    private static String getZoneDesc(TimeZone destzone) {
	    	Objects.requireNonNull(destzone);
		    int Offset = destzone.getRawOffset() / (1000 * 60 * 60);
		    if (Offset <= 0) {
			return "GMT"+String.valueOf(Offset);
		    } else {
			return "GMT+" + String.valueOf(Offset);
		    }
	    }
 //java8的方法,方式2,利用ZoneRules
	    //得到時區的標準偏移量,ZoneRules.getStandardOffset
	    //得到時區的實際偏移量(得到的偏移量會根據夏令時改變) 
            // 方式1:ZonedDateTime.getOffset
	    // 方式2:ZoneRules.getOffset
	    private  String getZoneDesc2(ZoneId dest) {
	    	Objects.requireNonNull(dest);
	    	ZoneRules rule=dest.getRules(); 
	    	//獲取時區的標準偏移量
	    	String standardOffset = rule.getStandardOffset(ZonedDateTime.now(dest).toInstant()).getId();
	    	String s = standardOffset.split(":")[0];
	    	int Offset = Integer.parseInt(s);
	    	//返回方式1:帶小時分鐘
//	    	return "GMT"+standardOffset;
	    	//返回方式2:只帶小時數
	    	if (Offset>0) {
	    		return "GMT+"+Offset;
			}else{
				return "GMT"+Offset;
			}
	    }
	    

4.如何獲取指定時區的指定時間

開始實現上面留下的時區問題啦

            同理先看下使用java8的夏令時判斷方法是否正確

      //先手寫個判斷美國的時間是否在夏令時
	    public  boolean isDaylightTime(LocalDateTime a) {
            Objects.requireNonNull(a);
            LocalDateTime startDate = a.withMonth(3).toLocalDate().atTime(2, 0);
	LocalDateTime startlightDay = startDate.with(TemporalAdjusters.dayOfWeekInMonth(2, DayOfWeek.SUNDAY));
			//更新為11月
	LocalDateTime endDate = a.withMonth(11).toLocalDate().atTime(1, 59,59);
	LocalDateTime endlightDay = endDate.with(TemporalAdjusters.dayOfWeekInMonth(1, DayOfWeek.SUNDAY));
			
	if (a.isBefore(startlightDay) || a.isAfter(endlightDay)) {
			System.out.println("不在夏令時"+a);
			return false;
		}
			System.out.println("在夏令時"+a);
			return true;
		}
	    
	    //其實java8 已經有現成的方法啦,比我的好用
	    //傳入指定時間和時區
	    public  boolean isDaylightTime(LocalDateTime a,ZoneId dest) {
	    	ZonedDateTime z1 = a.atZone(dest);
	    	//或者這樣轉
//	    	ZonedDateTime z2 = ZonedDateTime.of(a, dest);
	    	System.out.println(z1.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
	    	
	        ZoneRules rules = dest.getRules();
	        boolean flag= rules.isDaylightSavings(z1.toInstant());
	        System.out.println(flag);
		return flag;
	    }
//測試一下,發現java8的夏令時方法判斷完全正確噢
//已知2016年:America/New_York的夏令時時間是:  2016-3-13 02:00:00  到  2016-11-06 01:59:59 
//	         (每年3月的第二個星期日,11月的第一個星期日)
	    @Test
		public void testName() throws Exception {
//			LocalDateTime a1=LocalDateTime.now();
	    	LocalDateTime a2=LocalDateTime.of(2016, 3, 13, 1, 59,59);
			LocalDateTime a3=LocalDateTime.of(2016, 3, 13, 2, 00);
			LocalDateTime a4=LocalDateTime.of(2016, 11, 6, 1, 59,59);
			LocalDateTime a5=LocalDateTime.of(2016, 11, 6, 2, 0,0);
//			isDaylightTime(a2);
//			isDaylightTime(a3);
//			isDaylightTime(a4);
//			isDaylightTime(a5);
			
			System.out.println("=================");
			isDaylightTime(a2,ZoneId.of("America/New_York"));//false
			isDaylightTime(a3,ZoneId.of("America/New_York"));//true
			isDaylightTime(a4,ZoneId.of("America/New_York"));//true
			isDaylightTime(a5,ZoneId.of("America/New_York"));//fasle
		}

開始實現:

版本1:

//獲取指定時間的 指定時區時間    參照點:預設時區
		public LocalDateTime getZongTime(LocalDateTime time,ZoneId dest) {
			Objects.requireNonNull(dest);
			return getZongTime(time, null, dest);
		}

 //不能用2個時區的ZonedDateTime相減,因為這裡一旦指定時區,那個時間就是這個時區了
		public LocalDateTime getZongTime(LocalDateTime time,ZoneId src,ZoneId dest) {
			 //難點就是如何求偏移量
			//這裡使用預設時區,在中國的就是中國,在美國的就是美國,這樣估計更合適
			  Objects.requireNonNull(dest);
			  ZonedDateTime z1=null;
			  if (src==null) {
				   z1 = time.atZone(ZoneId.systemDefault());
			  }else{
				   z1 = time.atZone(src);
			  }
                        // 時區及時響應變化
			  ZonedDateTime z2 = z1.withZoneSameInstant(dest);
			  
			  System.out.println(dest.getId()+"對應得標準時區:"+getZoneDesc( TimeZone.getTimeZone(dest)));
			  System.out.println("目標時區"+dest+"的時間"+z2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
			  System.out.println("-------------");
			  return time;
		}
測試如下:
@Test
	public void test6() throws Exception {
		    //預計不在夏令時 2016-03-13 01:59:59
		    LocalDateTime time4= LocalDateTime.of(2016, 3, 13, 14, 59, 59);
		    getZongTime(time4,ZoneId.of("America/New_York"));
		
	        //預計在夏令時 2016-03-13 03:00:00
		    LocalDateTime time1= LocalDateTime.of(2016, 3, 13, 15, 00, 00);
			getZongTime(time1,ZoneId.of("America/New_York"));
			
			//預計在夏令時 結果呢:2016-11-06 01:59:59
			//感覺又失敗了,應該是2016-11-06 02:59:59
			//也就是說,此時java8對夏令時的結束處理之前的 方式3 一模一樣,提前了一小時判斷
			//即把夏令時結束時間當成了2016-11-6 00:59:59,但是java8的判斷方法是正確的呀,是不是有點奇怪
     		LocalDateTime time2= LocalDateTime.of(2016, 11, 6, 14, 59, 59);
			getZongTime(time2,ZoneId.of("America/New_York"));
              //預計不在夏令時2016-11-06 02:00:00
			LocalDateTime time3= LocalDateTime.of(2016, 11, 6, 15, 00, 00);
			getZongTime(time3,ZoneId.of("America/New_York"));
	}
所以我現在懷疑這種結果到底是不是系統計算問題呢,還是我不瞭解紐約的習俗呢?

但是還是可以得到我想要的結果的,運用2個方法:

withEarlierOffsetAtOverlap(),  withLaterOffsetAtOverlap()

版本2:

              //獲取指定時間的 指定時區時間    參照點:預設時區
		public LocalDateTime getZongTime2(LocalDateTime time,ZoneId dest) {
			Objects.requireNonNull(dest);
			return getZongTime2(time, null, dest);
		}
		//版本2 
		public LocalDateTime getZongTime2(LocalDateTime time,ZoneId src,ZoneId dest) {
			 //難點就是如何求偏移量
			//這裡使用預設時區,在中國的就是中國,在美國的就是美國,這樣估計更合適
			  Objects.requireNonNull(dest);
			  ZonedDateTime z1=null;
			  if (src==null) {
				   z1 = time.atZone(ZoneId.systemDefault());
			  }else{
				   z1 = time.atZone(src);
			  }
//		
			  ZonedDateTime z2 = z1.withZoneSameInstant(dest);
			  //處理重疊問題
			  long hours = Duration.between(z2.withEarlierOffsetAtOverlap(),  z2.withLaterOffsetAtOverlap()).toHours();
			  z2= z2.plusHours(hours);
			  
			  System.out.println(dest.getId()+"對應得標準時區:"+getZoneDesc( TimeZone.getTimeZone(dest)));
			  System.out.println("目標時區"+dest+"的時間"+z2.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
			  System.out.println("-------------");
			  return time;
		}

測試:OK了
@Test
	public void test4() throws Exception {
		 //預計不在夏令時 2016-03-13 01:59:59
	    LocalDateTime time4= LocalDateTime.of(2016, 3, 13, 14, 59, 59);
	    getZongTime2(time4,ZoneId.of("America/New_York"));
	
        //預計在夏令時 2016-03-13 03:00:00
	    LocalDateTime time1= LocalDateTime.of(2016, 3, 13, 15, 00, 00);
		getZongTime2(time1,ZoneId.of("America/New_York"));
		
		//預計在夏令時 2016-11-06 02:59:59
 		LocalDateTime time2= LocalDateTime.of(2016, 11, 6, 14, 59, 59);
		getZongTime2(time2,ZoneId.of("America/New_York"));
        //預計不在夏令時2016-11-06 02:00:00
		LocalDateTime time3= LocalDateTime.of(2016, 11, 6, 15, 00, 00);
		getZongTime2(time3,ZoneId.of("America/New_York"));
			
	}
結果:
America/New_York對應得標準時區:GMT-5
目標時區America/New_York的時間2016-03-13 01:59:59
-------------
America/New_York對應得標準時區:GMT-5
目標時區America/New_York的時間2016-03-13 03:00:00
-------------
America/New_York對應得標準時區:GMT-5
目標時區America/New_York的時間2016-11-06 02:59:59
-------------
America/New_York對應得標準時區:GMT-5
目標時區America/New_York的時間2016-11-06 02:00:00
-------------


相關推薦

關於java時區轉換夏令時問題解決辦法

關於中國的夏令時問題:參考另外一篇:http://mp.blog.csdn.net/postedit/78924498這裡:主要講的是: 在夏令時結束的時候,java會提前一個小時變化如:2016年美國夏令時:3.13-11.6  正常變化點:紐約時間2016-3-13 2:

java web 常見異常解決辦法

eset log const 鍵值 cannot tomcat action asp tex javax.servlet.ServletException: javax/servlet/jsp/SkipPageException 重啟tomcat, javax.serv

java.lang.NumberFormatException 錯誤解決辦法

sys main rgs 方法 cep integer rim parse pack package com.geelou.test; public class ErrTest { public static void main(String[] args

Java記憶體溢位場景解決辦法

       Java記憶體溢位即程式在申請記憶體時,沒有足夠的空間供其使用,出現out of memory。常見於四種情況:棧溢位(StackOverflowError)、堆溢位(OutOfMemoryError:java heap space)、永久代溢位(OutOfMe

Android不能呼叫java.awt的原因解決辦法和思考

android 裡面不能使用awt,底層沒有具體的實現awt android裡面的視窗建立過程決定了介面只能是android裡面的組建。 android的元件都是通過遠端的IPC呼叫完成的,也就是說服務端有什麼功能才能用什麼功能。 不是所有用java寫的程式都能在標準jv

java.sql.SQLException: 無法轉換為內部表示原因解決辦法

今天在寫完sql語句,執行時報如下錯誤: java.sql.SQLException: 無法轉換為內部表示; 第一次遇到這個問題,反覆檢視sql,在pl/sql裡執行sql語句都是正常的;查閱資料,才發現是自己將查詢結果對映成vo物件時,資料型別不一致造成的。 問題原因: 資料庫中欄位型別和

Java記憶體各部分OOM出現原因解決辦法

原文:https://blog.csdn.net/ls5718/article/details/52411211?utm_source=copy  一,jvm記憶體區域 1,  程式計數器 一塊很小的記憶體空間,作用是當前執行緒所執行的位元組碼的行號指示器。

java編碼,解碼。亂碼原因解決辦法

轉換流的編碼,常見的出現亂碼組合 package com.qianfeng.test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import

Java連結Redis時出現 “ERR Client sent AUTH, but no password is set” 異常的原因解決辦法

第一種情況: 在redis.conf中設定了密碼,而且redis還啟動了,為什麼說沒有密碼呢? linux下啟動redis有很多種方法, 方式一: ./redis-server &   這種方法啟動,不會帶上你的redis.conf配置檔案啟動 方式二:還有

格式工廠無法轉換qsv,qlv,kux格式的具體原因解決辦法

  格式工廠無法轉換愛奇藝視訊的qsv格式,騰訊視訊的qlv格式,優酷視訊的kux格式是有原因的,其實就是沒有轉換這三種視訊格式的核心,在新增qsv檔案,qlv檔案,kux檔案時,軟體也不會自動選擇這三種格式的視訊檔案。既然格式工廠無法轉換愛奇藝視訊的qsv格式,騰訊視訊的qlv格式,優酷視訊的kux格式

Java中的魔法值介紹解決辦法

所謂魔法值,是指在程式碼中直接出現的數值,只有在這個數值記述的那部分程式碼中才能明確瞭解其含義。 int [] array = new int[20]; for (int i = 0; i < 20; i++){ System.out.print(array

Java連線Redis時出現 “ERR Client sent AUTH, but no password is set” 異常的原因解決辦法

給redis設定過auth後發現還是出現這種情況,這是由於啟動redis時自動載入的redis配置檔案並不是我們配置的那個,我在服務中找到redis: 右擊redis選擇屬性 這裡發現redis啟動時使用我們之前配置在環境變數裡的.exe檔案,先將服務停止

Java鏈接Redis時出現 “ERR Client sent AUTH, but no password is set” 異常的原因解決辦法

edit 解決 apach 重新啟動 cti cau 文本編輯 cto coder Java鏈接Redis時出現 “ERR Client sent AUTH, but no password is set” 異常的原因及解決辦法 【錯誤提

Java設計模式學習-單例模式的漏洞解決辦法

通過對單例模式進行了學習,我們已經對單例模式已經有了一定的認識,但是不知道你們發現沒有,也存在幾個問題 反射可以破解上一篇部落格中的單例模式,其中不包含列舉單例模式。 反序列化也可以破解上一篇中的單例模式,其中也不包含列舉但離開模式。   那我們來看下

EventBus 和RxLifecycle 一起使用所引發的問題解決辦法 -java.lang.NoClassDefFoundError: android/os/PersistableBundle

之前一直用RxLifecycle 也沒啥事,但是在引入EventBus之後引發了一個異常:java.lang.NoClassDefFoundError: android/os/PersistableBundle ,這個異常剛開始沒發現,因為開始時使用的時高版本測

java初學者常見的八大誤區解決辦法

  這是java 初學者的深刻體會和學習經驗,現在摘錄在這裡,供大家分享學習和參考: 一、學習程式設計方法強調動手,強調實踐 1 、只有通過大量的實踐才能不斷的培養程式設計感覺 ; 2 、程式設計是有感覺的,就好象英語閱讀一樣,是有語感的 ; 3 、每天都要編寫程

java專案中遇到的問題解決辦法001

1.注意:ie如果找不到圖片顯示的是叉叉,而火狐則是什麼都不顯示       在做上傳頭像的時候,因為ngix始終沒開啟,所以不顯示圖片       查詢問題:首先檢視原始碼,看imageService.getPicture(user.getFace()).getSmall

java中ArrayList使用remove刪除元素時幾種常見的問題解決辦法

一,for迴圈使用remove()刪除座標來刪除元素。 問題現象:迴圈的時候被刪除元素的下個元素不能讀取到。程式碼現象如下: List<String> testList1 = new ArrayList<Stri

關於java連線sql server 2008遇到的各種問題解決辦法

解決java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver問題                學習java連線sql server 2008資料庫時候,遇到java.lang

java.lang.NoSuchMethodError 錯誤的原因解決辦法

不多說,先貼上錯誤 =========== 詳細: org.springframework.context.ApplicationContextException: Unable to start embedded container; nest