挑戰(zhàn)程序設(shè)計(jì)_程序設(shè)計(jì)導(dǎo)引及在線實(shí)踐之時(shí)區(qū)間時(shí)間的轉(zhuǎn)換
本文關(guān)鍵詞:程序設(shè)計(jì)導(dǎo)引及在線實(shí)踐,由筆耕文化傳播整理發(fā)布。
程序設(shè)計(jì)導(dǎo)引及在線實(shí)踐之時(shí)區(qū)間時(shí)間的轉(zhuǎn)換
5.5 例題:時(shí)區(qū)間時(shí)間的轉(zhuǎn)換
問題描述
直到 19世紀(jì),時(shí)間校準(zhǔn)是一個(gè)純粹的地方現(xiàn)象。每一個(gè)村莊當(dāng)太陽升到昀高點(diǎn)的時(shí)候把他們的時(shí)鐘調(diào)到中午 12點(diǎn)。一個(gè)鐘表制造商人家或者村里主表的時(shí)間被認(rèn)為是官方時(shí)間,市民們把自家的鐘表和這個(gè)時(shí)間對齊。每周一些熱心的市民會(huì)帶著時(shí)間標(biāo)準(zhǔn)的表,游走大街小巷為其他市民對表。在城市之間旅游的話,在到達(dá)新地方的時(shí)候需要把懷表校準(zhǔn)。但是,當(dāng)鐵路投入使用之后,越來越多的人頻繁地長距離地往來,時(shí)間變得越來越重要。在鐵路的早期,時(shí)刻表非常讓人迷惑,每一個(gè)所謂的?繒r(shí)間都是基于?康攸c(diǎn)的當(dāng)?shù)貢r(shí)間。時(shí)間的標(biāo)準(zhǔn)化對于鐵路的高效運(yùn)營變得非常重要。
在 1878年,加拿大人 Sir Sanford Fleming 提議使用一個(gè)全球的時(shí)區(qū)(這個(gè)建議被采納,,并衍生了今天我們所使用的全球時(shí)區(qū)的概念),他建議把世界分成 24個(gè)時(shí)區(qū),每一個(gè)跨越 15度經(jīng)線(因?yàn)榈厍虻慕?jīng)度 360度,劃分成 24塊后,一塊為 15度)。Sir Sanford Fleming的方法解決了一個(gè)全球性的時(shí)間混亂的問題。
美國鐵路公司于 1883年 11月 18日使用了 Fleming 提議的時(shí)間方式。 1884年一個(gè)國際子午線會(huì)議在華盛頓召開,他的目的是選擇一個(gè)合適的本初子午線。大會(huì)昀終選定了格林威治為標(biāo)準(zhǔn)的 0度。盡管時(shí)區(qū)被確定了下來,但是各個(gè)國家并沒有立刻更改他們的時(shí)間規(guī)范,在美國,盡管到 1895年已經(jīng)有很多州開始使用標(biāo)準(zhǔn)時(shí)區(qū)時(shí)間,國會(huì)直到 1918年才強(qiáng)制使用會(huì)議制定的時(shí)間規(guī)范。
今天各個(gè)國家使用的是一個(gè) Fleming時(shí)區(qū)規(guī)范的一個(gè)變種,中國一共跨越了 5個(gè)時(shí)區(qū),但是使用了一個(gè)統(tǒng)一的時(shí)間規(guī)范,比 Coordinated Universal Time(UTC,格林威制時(shí)間)早 8個(gè)小時(shí)。俄羅斯也擁護(hù)這個(gè)時(shí)區(qū)規(guī)范,盡管整個(gè)國家使用的時(shí)間和標(biāo)準(zhǔn)時(shí)區(qū)提前了 1個(gè)小時(shí)。澳大利亞使用 3個(gè)時(shí)區(qū),其中主時(shí)區(qū)提前于他按 Fleming規(guī)范的時(shí)區(qū)半小時(shí)。很多中東國家也使用了半時(shí)時(shí)區(qū)(即不是按照 Fleming的 24個(gè)整數(shù)時(shí)區(qū))。
因?yàn)闀r(shí)區(qū)是對經(jīng)度進(jìn)行劃分,在南極或者北極工作的科學(xué)家直接使用了 UTC時(shí)間,否則南極大陸將被分解成 24個(gè)時(shí)區(qū)。
時(shí)區(qū)的轉(zhuǎn)化表如下:
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
下面給出了一些時(shí)間,請?jiān)诓煌瑫r(shí)區(qū)之間進(jìn)行轉(zhuǎn)化。輸入數(shù)據(jù)輸入的第一行包含了一個(gè)整數(shù) N,表示有 N組測試數(shù)據(jù)。接下來 N行,每一行包
括一個(gè)時(shí)間和兩個(gè)時(shí)區(qū)的縮寫,它們之間用空格隔開。時(shí)間由標(biāo)準(zhǔn)的 a.m./p.m給出。
midnight表示晚上 12點(diǎn)(12:00 a.m.),noon表示中午 12點(diǎn)(12:00 p.m.)。
輸出要求
假設(shè)輸入行給出的時(shí)間是在第一個(gè)時(shí)區(qū)中的標(biāo)準(zhǔn)時(shí)間,要求輸出這個(gè)時(shí)間在第二個(gè)時(shí)區(qū)中的標(biāo)準(zhǔn)時(shí)間。
輸入樣例
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.
解題思路
這個(gè)題目要求在兩個(gè)時(shí)區(qū)之間進(jìn)行時(shí)間的轉(zhuǎn)換。我們根據(jù)每個(gè)時(shí)區(qū)與格林威治時(shí)間的轉(zhuǎn)換公式可以推算出兩個(gè)時(shí)區(qū)之間的差別。問題的解決方法不難想到,只是日期處理類問題具有共同的特點(diǎn)就是輸入輸出比較麻煩,有一些需要特殊處理的情況,例如轉(zhuǎn)換后多出一天或少了一天的情況需要處理。具體到這個(gè)題目來說:輸入時(shí),除了一般的時(shí)間表示法:時(shí):分
a.m/p.m.之外,要特殊處理 noon和 midnight;在直接通過格林威治時(shí)間進(jìn)行轉(zhuǎn)換后,要判斷是否超過一天或減少了一天的情況;在輸出時(shí)間時(shí),要對 noon和 midnight進(jìn)行特殊處理。
解決這個(gè)問題時(shí),關(guān)鍵的是確定兩個(gè)時(shí)區(qū)之間的時(shí)差。因?yàn)闀r(shí)區(qū)是用字符串形式給出的,所以要先將時(shí)區(qū)對應(yīng)到該時(shí)區(qū)與格林威治時(shí)間的時(shí)差上。有了每個(gè)時(shí)區(qū)與格林威治時(shí)間的時(shí)差,就可以計(jì)算任意兩個(gè)時(shí)區(qū)之間的時(shí)差。
參考程序
#include
本文關(guān)鍵詞:程序設(shè)計(jì)導(dǎo)引及在線實(shí)踐,由筆耕文化傳播整理發(fā)布。
本文編號:194671
本文鏈接:http://sikaile.net/wenshubaike/xxkj/194671.html