時區轉換 (map 和 struct 的應用)—— C++

直到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

代碼:.

#include <iostream>
#include<map>
#include<string>
using namespace std;
struct shijian { //定義時間結構體
	string time, biao; // time 用來儲存 12:00 ,biao 用來存儲 a.m. 等標識
}sj;
void zUTC(struct shijian &a, double cha) {//時間轉換函數
	int tem;//臨時變量
	int qian = stoi(a.time.substr(0, a.time.find(":")));//用來存儲12:00 的 12
	int hou = stoi(a.time.substr(a.time.find(":") + 1));//用來存儲12:00 的 00
	if (a.biao == "a.m.")// 時間爲上午,特殊考慮凌晨 12 點
		qian == 12 ? tem = hou : tem = qian * 60 + hou;
	else// 時間爲下午,特殊考慮中午 12 點
		qian == 12 ? tem = qian * 60 + hou : tem = (qian + 12) * 60 + hou;
	tem += cha * 60;//兩地時間差
	if (tem < 0)
		tem = 1440 + tem;
	int hour = tem / 60 % 24;
	int minute = tem % 60;
	if (hour >= 12) {// 時間爲下午,特殊考慮中午 12 點
		if (hour != 12) {
			if(minute%10==minute)//注意輸出格式
				a.time = to_string(hour - 12) + ":0" + to_string(minute);
			else 
				a.time = to_string(hour - 12) + ":" + to_string(minute);
		}
		else {
			if (minute % 10 == minute)
				a.time = "12:0" + to_string(minute);
			else
				a.time = "12:" + to_string(minute);
		}
		a.biao = "p.m.";
	}
	else{// 時間爲上午,特殊考慮凌晨 12 點( 0 點)
		if (hour != 0) {
			if (minute % 10 == minute)
				a.time = to_string(hour) + ":0" + to_string(minute);
			else
				a.time = to_string(hour) + ":" + to_string(minute);		
		}
		else {
			if (minute % 10 == minute)
				a.time = "12:0" + to_string(minute);
			else
				a.time = "12:" + to_string(minute);
		}
		a.biao = "a.m.";
	}
}
int main() {
	map<string, double> map;
	map["UTC"] = 0;
	map["GMT"] = 0;
	map["BST"] = 1;
	map["IST"] = 1;
	map["WET"] = 0;
	map["WEST"] = 1;
	map["CET"] = 1;
	map["CEST"] = 2;
	map["EET"] = 2;
	map["EEST"] = 3;
	map["MSK"] = 3;
	map["MSD"] = 4;
	map["AST"] = -4;
	map["ADT"] = -3;
	map["NST"] = -3.5;
	map["NDT"] = -2.5;
	map["EST"] = -5;
	map["EDT"] = -4;
	map["CST"] = -6;
	map["CDT"] = -5;
	map["MST"] = -7;
	map["MDT"] = -6;
	map["PST"] = -8;
	map["PDT"] = -7;
	map["HST"] = -10;
	map["AKST"] = -9;
	map["AKDT"] = -8;
	map["AEST"] = 10;
	map["AEDT"] = 11;
	map["ACST"] = 9.5;
	map["ACDT"] = 10.5;
	map["AWST"] = 8;
	int n;
	while (cin >> n) {
		while (n--){
			string tem; cin >> tem;
			string time, biao, part1, part2;// time 用來儲存 12:00 ,biao 用來存儲 a.m. 等標識
			if (tem == "noon") {
				sj.time = "12:00";
				sj.biao = "p.m.";
			}
			else if (tem == "midnight") {
				sj.time = "12:00";
				sj.biao = "a.m.";
			}
			else {
				sj.time = tem;
				cin >> sj.biao;
			}
			cin >> part1 >> part2;//輸入地區名
			double cha = map[part2] -map[part1];//計算兩地區時差
			zUTC(sj, cha);
			if (sj.time == "12:00"&&sj.biao == "a.m.")
				cout << "midnight" << endl;
			else if (sj.time == "12:00"&&sj.biao == "p.m.")
				cout << "noon" << endl;
			else
				cout << sj.time << " " << sj.biao << endl;
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章