TimeZone 계산 시간대 및 여름철 처리, 파충류에 사용 가능

배경: 파충류는 서로 다른 국가의 사이트의 데이터를 캡처해야 하고 모두 한밤중 0시에cronjob에서 시작해야 한다. 서버가 설정한 시간은 UTC+0의 시간이고 데이터베이스에 저장된 시간도 UTC+0의 시간이다. 제어된 시간의 필드는runAfter라고 가정한다.
시간대가 다르다는 것을 감안하여 우리는 국가가 있는 시간대를 판단하여 미리 뛸 수 있다. 예를 들어 미국 로스앤젤레스, UTC-7, 그러면 런애프터는 서버의 전날 17:00에 미국 로스앤젤레스 사이트의 데이터를 잡을 수 있다. 왜냐하면 이때가 바로 현지의 새벽이기 때문이다.
그리고 스위스, UTC+2(여름철)에 우리는 프로그램이 서버의 02:00 시간에 달려가서 스위스 현지 사이트의 데이터를 잡을 수 있다.
프로그램은 권한을 가지고 완주할 수 있을 뿐만 아니라, 기어오르는 사이트의 자체 성능에도 영향을 주지 않는다.
TimeZone을 사용하여 여름철을 처리할 때 다음 자바 코드
package test;

import java.util.Date;
import java.util.ResourceBundle;
import java.util.TimeZone;

 

public class TimeZoneHandle {
	public static ResourceBundle rb = ResourceBundle.getBundle("timezone");

	/*
	 * use getOffset to handle the daylight saving time. the new Date() give us
	 * the UTC+0 date,and it is also the server time.
	 */
	public Date getLocalTime(Job job) {
		Date now = new Date();
		String country = job.getCountry();
		// if the configure file contain the country,we will compute the local
		// time.
		if (rb.containsKey(country)) {
			int crawlerCountryoffset = getCrawlerCountryoffset(country, now);
			int serverZoneOffset = TimeZone.getDefault().getOffset(now.getTime());
			Date localTime = new Date(now.getTime() - (serverZoneOffset - crawlerCountryoffset));
			return localTime;
		} else {
			return now;
		}
	}

	private int getCrawlerCountryoffset(String country, Date date) {
		String timezone_ID = rb.getString(country);
		int offset = TimeZone.getTimeZone(timezone_ID).getOffset(date.getTime());
		return offset;
	}

	  class Job {
		// other fields like Job id
		// ...

		String country;

		public String getCountry() {
			return country;
		}

		public void setCountry(String country) {
			this.country = country;
		}
		
		
	}
	public static void main(String[] argc) {
		TimeZoneHandle timezonehandle=new TimeZoneHandle();
		Job job=timezonehandle.new Job();
		job.setCountry("SE");
		Date d= timezonehandle.getLocalTime( job);
		System.out.println(d);
	}
}

설정 파일은 src 소스 패키지 아래에 놓입니다
AT= Europe/Vienna
BE= Europe/Brussels
BR= Brazil/East
CA= Canada/Eastern
CH= 
CN= 
DE= Europe/Berlin
DK= Europe/Copenhagen
ES= 
FI= 
FR= Europe/Paris
GR= 
IE= 
IN= 
IT= 
LU= 
NL= 
NO= 
PT= 
SE= Europe/Stockholm
UK= Europe/London
US= 

다음은 자바입니다.util.Date,SimpleDateFormat,java.util.Calendar 정리
일.
java.util.Date는 서기 1970년 1월 1일 00:00:00까지의 밀리초 수를 나타내는 시점입니다.그래서 시간대와 Locale 개념이 없어요.
java에서 현재 시점은 다음과 같습니다.
Date now = new Date();//이 시점은 로컬 시스템의 시간대와 무관합니다. 시간대와 무관해서 우리의 저장 데이터 (시간) 가 일치합니다. (시간 일치성)
 
이.
일반적인 우리는now를 데이터베이스에 저장하고 데이터를 보여야 할 때now를 원하는 형식으로 포맷합니다. 예를 들어 2011-12-04 21:22:24
이 기능은 일반적으로java에 맡긴다.text.DateFormat을 통해 구현할 수 있습니다.예:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String snow = sdf.format(now);
우리는 스노우가 시간(예를 들어 2011-12-04 21:22:24)을 가진 문자열이라는 것을 발견했다. 그러면 2011-12-04 21:22:24는 어느 시간대의 시간입니까?
기본적으로 SimpleDateFormat은 로컬 시스템의 시간대(GMT+8 베이징)를 가져와서 pattern("yyy-MM-dd HH:mm:ss")에 따라 now를 포맷합니다.
이때 출력된 것은 GMT+8구역의 시간이다.국제화 시간을 지원하려면 시간대를 지정한 다음date 데이터를 포맷합니다.
예:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
String snow = sdf.format(now);//snow = 2011-12-04 21:22:24
sdf.setTimeZone(TimeZone.getTimeZone("GMT+7"));
String snow2 = sdf.format(now);//snow2 = 2011-12-04 20:22:24 (가시: 동8구가 동7구보다 한 시간 빠르다)
또한 다음 코드를 통해 로컬 시간대 정보를 수정할 수 있습니다.
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
linux 시스템에서 다음 명령을 통해 현재 시간대를 얻을 수 있습니다
date -R
삼.
java.util.Calendar 클래스도 시간점을 대표하지만 Date의facade 도구 클래스로 시간점에서 년, 월, 일, 시, 분, 초, 주 등으로 전환하는 편리한 방법을 많이 제공합니다.
Calendar calendar = Calendar.getInstance(timezone); 
Date d = calendar.getTime();
Calendar의 계산도 시간대를 기반으로 한다. 예를 들어 같은date가 동시 구역에 있지 않은 시간수는 다르다.하지만 캘린더.getTime();되돌아오는 날짜는 날짜 형식이기 때문에 시간대가 없습니다.예:
 public static void main(String[] args) throws InterruptedException {
  Calendar calendar1 = Calendar.getInstance(TimeZone.getTimeZone("GMT+8"));
  Calendar calendar2 = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
 
  System.out.println("Millis = "+ calendar1.getTimeInMillis());
  System.out.println("Millis = "+ calendar2.getTimeInMillis());
 
  System.out.println("hour = "+ calendar1.get(Calendar.HOUR));
  System.out.println("hour = "+ calendar2.get(Calendar.HOUR));
 
  System.out.println("date = "+ calendar1.getTime());
  System.out.println("date = "+ calendar2.getTime());
 }
출력:
Millis = 1342497217103
Millis = 1342497217104
hour = 11
hour = 4
date = Tue Jul 17 11:53:37 CST 2012
date = Tue Jul 17 11:53:37 CST 2012
참조된 웹 주소:
http://www.cnblogs.com/flying5/archive/2011/12/05/2276578.html
http://blog.163.com/haizai219@126/blog/static/444125552009101924912981/

좋은 웹페이지 즐겨찾기