c语言 北京时间转换utc时间_c语言实战 BJT时间转化位UTC时间
题目是这样的:
题目内容:
UTC是全球统一协调时基准,而BJT则指采用国际 atomic time offset 的中国标准时间。在转换时区关系上,UTC相当于BJT减去8小时的时间差。目前,请你的程序读取一个整数作为输入数据,并将该数值解码为对应的时间信息:其中个位与十位数字代表分钟数值(需补前导零至两位),百位与千位数字代表小时数值(同样需补前导零至两位)。具体来说:若小时小于10,则千位缺省;若小时为零,则百位缺省;若分钟小于10,则十位需补零显示。例如:1124代表11时24分;905代表9时零5分;36代表零点36分;7则表示零点零七分。
允许的有效输入范围是从0至2359;该程序无法从测试服务器获取超出该范围的数据。
你的程序应返回该时间对应的UTC时间值。该值以相同格式呈现:整数中的后两位为分钟值(最低两位),前两位为小时值(高位两位)。当小时小于10时仅保留后两位;若为零则忽略百位及更高位置;当分钟少于10时需补零以确保两位显示。
提醒:要小心跨日的换算。
输入格式:
由一个整数组成的时间显示装置中,每一位数字分别代表不同的时间单位。具体来说:
个位代表分钟的十位数字,
十位代表分钟的个位数字,
百位和千位分别代表小时的十位和个位数字。
当小时值小于10时,
百位将被省略;
当小时值为零时,
千位同样被省略;
对于分钟值小于10的情况,
必须保留前导零以确保时间信息完整。
输出格式:
一个数值字段用于标识UTC时间中的小时与分钟。该字段由四位数字组成:其中后两位(个位与十)代表分钟数值;前两位(百与千)代表小时数值。具体而言:
- 当小时值低于10时,则不包含千分之一的位置;
 - 当小时值为零时,则不包含百分之一的位置;
 - 若分钟值低于10,则需保留十分之一位置上的零数值。
 
输入样例:
903
输出样例:
103
我是如何思考这个问题的。首先我们知道了关于UTC时间和BJT时间之间存在一个关键的关系式:utc\ time = bjt\ time - 8;也就是说,在知道BJT时间的情况下只需要将BJT的时间中的小时部分减去8就能得出对应的UTC时间;因此在实际操作中我们只需分解并计算UTC的时间以及其分钟数值即可完成整个问题。
这是大概的思路。接着拿一个具体的时间举例来验证刚才的思路。
比如bjt时间是2038,意思是20点38分,那么怎么分离出小时数和分钟数呢?
2038对100取余就得到了分钟数了,2038-分钟数的结果再除以100就得到了小时数了。
这样可行吗?经过测试发现,在大多数情况下是可以运行的。然而,在遇到类似的时间段(如凌晨5:38),则无法完成任务。
由于-8时就会出现负数这一问题本身是不正确的。显然地,在这种情况下我们已经遇到了时间跨越两天的情况发生。因此,在这种情况下我们必须将小时与8进行比较才能得到正确的结果。
如果当前小时数≥8,则表示当天剩余的时间可以直接扣除8小时;如果当前小时数<8,则表明UTC当前时间为前一天的时间段,在这种情况下就需要采用UTC前一天的时区进行计算。
BJT的小时数+24再减去8才得到正确的UTC小时。
无需直接输出小时数与分钟数值。经测试发现:当输入数据为'0:08'时,系统会返回数值168。按照上述规范解释的话,则会认为返回值表示时间为'1:68'。这种解读存在明显错误。然而实际上,数值168应理解为'16:08',正确的输出格式应写作'16:08'。那么该如何处理呢?
很简单把小时数100之后再加上分钟数就可以了,16100+8=1608,ok这下没什么问题了。
/*
UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8。
现在,你的程序要读入一个整数,表示BJT的时和分。
整数的个位和十位表示分,百位和千位表示小时。
若小时数不足千(即小于一千),则忽略千的部分;当小时数值为零时,则不考虑百的部分;若分钟数不足十(即少于十分之一),需在十位上补零。
如1124表示11点24分,而905表示9点5分,36表示0点36分,7表示0点7分。
允许的输入范围是从0到2359;也就是说, 你的程序不可能从测试服务器读取超出该范围的数据
为了使程序能正确显示给定的时间对应的UTC时刻,请确保输出格式与输入一致,并将结果以一个整数值的形式返回表示UTC时刻的具体小时和分钟数值。
整数的个(十) 两位数字代表分数值(分钟),而三位及四位数字代表小(大)时数值(当时间超过99 分钟时)。当小 小于 十分钟时(即不足一 小时),则不使用千 分度位置;若小 时间刚好为零(即无时间),则忽略百 分度位置;对于不足十分之一小 时的时间值(即仅有一位分钟数值),在十分之一位上必须补零以示明确.
*/
//需要一个变量保存用户输入的BJT时间
int BJT = 0;
//两个变量分别保存BJT时间的小时和分钟
int BJTh = 0;
int BJTm = 0;
//对输入的BJT时间限制(0~2359)
scanf_s("%d",&BJT);
if (BJT < 0)
{
printf("unexpected input,program will quit at once");
return 0;
}
if (BJT > 2359)
{
printf("unexpected input,program will quit at once");
return 0;
}
//分离出BJT时间的小时和分钟
BJTm = BJT%100;
BJTh = (BJT - BJTm) / 100;
/*
分离出来的小时数如果大于等于8,直接减去8 就是UTC时间
当分离出来的小时数低于8时, 将该数值加24后减去8即可得到UTC时间. 24小时计时
*/
if (BJTh < 8)
{
//乘100之后就是最后UTC时间的千分位和百分位的和了。
printf("UTC time is:%d", ((BJTh + 24 - 8)*100)+BJTm);
return 1;
}
printf("UTC time is:%d",((BJTh-8)*100)+BJTm);
return 1;
2018.9.15更新
int main()
{
//保存用户输入的BJT时间
int BJT = 0;
//保存BJT里面的时间和分钟
int BJT_h = 0;
int BJT_m = 0;
//保存UTC时间
int UTC = 0;
scanf_s("%d", &BJT);
//校验数据合法性
if(BJT<0||BJT>2359)
{
printf("wrong input ,the program will quit at once");
return 0;
}
//从BJT时间分离出时间和分钟
BJT_h = BJT / 100;
BJT_m = BJT % 100;
if (BJT_h <= 8)
{
UTC = (BJT_h - 8 + 24) * 100 + BJT_m;
printf("%d",UTC);
}
else
{
UTC = (BJT_h - 8) * 100 + BJT_m;
printf("%d", UTC);
}
