1. 程式人生 > >JavaStudy——0058:時區轉換

JavaStudy——0058:時區轉換

總時間限制: 1000ms 記憶體限制: 65536kB

描述 直到19世紀,時間校準是一個純粹的地方現象。每一個村莊當太陽升到最高點的時候把他們的時鐘調到中午12點。一個鐘錶製造商人家或者村裡主表的時間被認為是官方時間,市民們把自家的鐘表和這個時間對齊。每週一些熱心的市民會帶著時間標準的表,遊走大街小巷為其他市民對錶。在城市之間旅遊的話,在到達新地方的時候需要把懷錶校準。但是,當鐵路投入使用之後,越來越多的人頻繁地長距離地往來,時間變得越來越重要。在鐵路的早期,時刻表非常讓人迷惑,每一個所謂的停靠時間都是基於停靠地點的當地時間。時間的標準化對於鐵路的高效運營變得非常重要。 在1878年,加拿大人Sir Sanford Fleming 提議使用一個全球的時區(這個建議被採納,並衍生了今天我們所使用的全球時區的概念),他建議把世界分成24個時區,每一個跨越15度經線(因為地球的經度360度,劃分成24塊後,一塊為15度)。Sir Sanford Fleming的方法解決了一個全球性的時間混亂的問題。 美國鐵路公司於1883年11月18日使用了Fleming 提議的時間方式。1884年一個國際子午線會議在華盛頓召開,他的目的是選擇一個合適的本初子午線。大會最終選定了格林威治為標準的0度。儘管時區被確定了下來,但是各個國家並沒有立刻更改他們的時間規範,在美國,儘管到1895年已經有很多州開始使用標準時區時間,國會直到1918年才強制使用會議制定的時間規範。 今天各個國家使用的是一個Fleming時區規範的一個變種,中國一共跨越了5個時區,但是使用了一個統一的時間規範,比Coordinated Universal Time(UTC,格林威制時間)早8個小時。俄羅斯也擁護這個時區規範,儘管整個國家使用的時間和標準時區提前了1個小時。澳大利亞使用3個時區,其中主時區提前於他按Fleming規範的時區半小時。很多中東國家也使用了半時時區(即不是按照Fleming的24個整數時區)。 因為時區是對經度進行劃分,在南極或者北極工作的科學家直接使用了UTC時間,否則南極大陸將被分解成24個時區。 時區的轉化表如下: UTC Coordinated Universal Time GMT Greenwich Mean Time, 定義為 UTC BST British Summer Time, 定義為 UTC+1 hour IST Irish Summer Time, 定義為 UTC+1 hour WET Western Europe Time, 定義為 UTC WEST Western Europe Summer Time, 定義為 UTC+1 hour CET Central Europe Time, 定義為 UTC+1 CEST Central Europe Summer Time, 定義為 UTC+2 EET Eastern Europe Time, 定義為 UTC+2 EEST Eastern Europe Summer Time, 定義為 UTC+3 MSK Moscow Time, 定義為 UTC+3 MSD Moscow Summer Time, 定義為 UTC+4 AST Atlantic Standard Time, 定義為 UTC-4 hours ADT Atlantic Daylight Time, 定義為 UTC-3 hours NST Newfoundland Standard Time, 定義為 UTC-3.5 hours NDT Newfoundland Daylight Time, 定義為 UTC-2.5 hours EST Eastern Standard Time, 定義為 UTC-5 hours EDT Eastern Daylight Saving Time, 定義為 UTC-4 hours CST Central Standard Time, 定義為 UTC-6 hours CDT Central Daylight Saving Time, 定義為 UTC-5 hours MST Mountain Standard Time, 定義為 UTC-7 hours MDT Mountain Daylight Saving Time, 定義為 UTC-6 hours PST Pacific Standard Time, 定義為 UTC-8 hours PDT Pacific Daylight Saving Time, 定義為 UTC-7 hours HST Hawaiian Standard Time, 定義為 UTC-10 hours AKST Alaska Standard Time, 定義為 UTC-9 hours AKDT Alaska Standard Daylight Saving Time, 定義為 UTC-8 hours AEST Australian Eastern Standard Time, 定義為 UTC+10 hours AEDT Australian Eastern Daylight Time, 定義為 UTC+11 hours ACST Australian Central Standard Time, 定義為 UTC+9.5 hours ACDT Australian Central Daylight Time, 定義為 UTC+10.5 hours AWST Australian Western Standard Time, 定義為 UTC+8 hours 下面給出了一些時間,請在不同時區之間進行轉化。

輸入 輸入的第一行包含了一個整數N,表示有N組測試資料。接下來N行,每一行包括一個時間和兩個時區的縮寫,它們之間用空格隔開。時間由標準的a.m./p.m給出。midnight表示晚上12點(12:00 a.m.),noon表示中午12點(12:00 p.m.)。 輸出 假設輸入行給出的時間是在第一個時區中的標準時間,要求輸出這個時間在第二個時區中的標準時間。

樣例輸入

4
noon HST CEST 
11:29 a.m. EST GMT
6:01 p.m. CST UTC
12:40 p.m. ADT MSK

樣例輸出

midnight
4:29 p.m.
12:01 a.m.
6:40 p.m.

Accepted程式碼

import java.util.Scanner;
public class Main {
    static String[] zone=new String[]
            {"UTC","GMT","BST","IST","WET","WEST","CET","CEST",
             "EET","EEST","MSK","MSD","AST","ADT","NST","NDT",
             "EST","EDT","CST","CDT","MST","MDT","PST","PDT",
             "HST","AKST",
"AKDT","AEST","AEDT","ACST","ACDT","AWST"}; static double[] time=new double[]{0,0,1,1,0,1,1,2,2,3,3,4, -4,-3,-3.5,-2.5,-5,-4, -6,-5,-7,-6,-8,-7,-10, -9,-8,10,11,9.5,10.5,8}; public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); for(int i=0;i<n;i++) { String input1=in.next(); int hours=0,minutes=0; switch(input1) { case "noon": hours=12;minutes=0;break; case "midnight": hours=0;minutes=0;break; default :String[] tmp=input1.split("\\:"); hours=Integer.parseInt(tmp[0]); minutes=Integer.parseInt(tmp[1]); hours%=12; String input2=in.next(); if(input2.compareTo("p.m.")==0) hours+=12; } String timezone1=in.next(); String timezone2=in.next(); int p=0,q=0; while(timezone1.equals(zone[p])!=true) {p++;} while(timezone2.equals(zone[q])!=true) {q++;} double tmp=time[q]-time[p]; if (tmp<0) tmp+=24; int tmp1=hours*60+minutes+(int)(tmp*60); if(tmp1>1440) tmp1-=1440; if(tmp1%1440==0) System.out.println("midnight"); else if (tmp1==720) System.out.println("noon"); else if (tmp1<60) System.out.printf("12:%02d a.m.\n",tmp1); else if (tmp1<720) System.out.printf("%d:%02d a.m.\n",tmp1/60,tmp1%60); else if (tmp1<780) System.out.printf("%d:%02d p.m.\n",tmp1/60,tmp1%60); else System.out.printf("%d:%02d p.m.\n",(tmp1/60-12),tmp1%60); } in.close(); } }