Advertisement

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);

}

全部评论 (0)

还没有任何评论哟~