问题描述
直到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 <stdio.h> int diff(char* zone1, char* zone2){ char* zone[32]={"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"}; float time[32]={0,0,1,1,0,1,1,2,2,3,3,4,-4,-3,-3.5,-2.5,-5,-4,-6,-5,-7,13. -6,-8,-7,-10,-9,-8,10,11,9.5,10.5,8}; int i = 0 ,j = 0; while(strcmp(zone[i], zone1)) i++; while(strcmp(zone[j], zone2)) j++; return (time[i]- time[j]) * 60; } int main(){ int nCases; scanf("%d", &nCases); while(nCases --){ char time[10]; int hours, minutes; scanf("%s", time); switch(time[0]){ case 'n': hours = 12; minutes = 0;break; case 'm': hours = 0; minutes = 0;break; default: sscanf(time, "%d:%d", &hours, &minutes); hours %= 12; scanf("%s", time); if(time[0] == 'p') hours += 12; } char timezone[5], timezoneT[5]; scanf("%s%s", timezone, timezoneT); int newTime; newTime = hours * 60 + minutes + diff(timezoneT,timezone); if(newTime < 0) newTime += 1440; newTime %= 1440; switch(newTime){ case 0: printf("midnight\n"); break; case 720: printf("noon"); break; default: hours = newTime /60; minutes = newTime % 60; if(hours == 0) printf("12:%02d a.m\n", minutes); else if(hours < 12) printf("%d:%02d a.m\n", hours, minutes); else if(hours == 12) printf("12:%02d p.m\n", minutes); else printf("%d:%02d p.m\n", hours % 12,minutes); } } return 0; }