注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

获得指定UTC时间所在周一凌晨时间  

2014-11-09 18:02:34|  分类: Linux系统编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、基本思路
基本想法就是首先以周为单位向下取整,而unix的epoch时间对应北京时间(东八区)为周四上午8点整,之后再减去这个时间,获得该时间所在周的周一凌晨时间。这种方法可以避免使用localtime函数,速度相对会快很多。基于这个函数,可以做很多时间相关的处理,例如判断两天是不是在同一周;判断当前时间是否在一周的某个时间段(例如判断当前时间是否在周一下午2点到周二上午8点)等。它的问题在于没有读取当前所在时区,不过这个值通常可以在系统初始化时读取,问题不大。下面是C代码,这里定义的枚举只是为了便于阅读,也可以把整个表达式写作一个式子,编译阶段编译器会进行常量展开,汇编代码相同,执行效率相同。
{
    //从Unix epoch 开始,第一个周一凌晨时间是(24 * 3 + 16) * 60 * 60
    enum
    {
        FirstMondayUnixTime = (24 * (7 - 4) + (24 - 8)) * 60 * 60,//7为一周天数,4为周四,8为凌晨8点
        WeekSeconds         = 60 * 60 * 24 * 7,
    };
    
    return (stTimeNow - FirstMondayUnixTime)/ WeekSeconds * WeekSeconds + FirstMondayUnixTime;
}
二、简单验证
从当前时间前后40天的取值
tsecer @harry: for  (( day = 0; day <=40; day++));  do echo Nowdate: $(date -d"$day days ago" ); echo weekmon $( date   -d@$(( ($( date -d"$day days ago" +%s) - (24 * 3 + 16) * 60 * 60)/(60 * 60 * 24 * 7) * (60 * 60 * 24 * 7)  + (24 * 3 + 16) * 60 * 60)));echo ; done 
Nowdate: 2014年 11月 09日 星期日 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 08日 星期六 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 07日 星期五 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 06日 星期四 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 05日 星期三 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 04日 星期二 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 03日 星期一 18:00:55 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 02日 星期日 18:00:55 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 11月 01日 星期六 18:00:56 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 10月 31日 星期五 18:00:56 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 10月 30日 星期四 18:00:56 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 10月 29日 星期三 18:00:56 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 10月 28日 星期二 18:00:56 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 10月 27日 星期一 18:00:56 CST
weekmon 2014年 10月 27日 星期一 00:00:00 CST

Nowdate: 2014年 10月 26日 星期日 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 25日 星期六 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 24日 星期五 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 23日 星期四 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 22日 星期三 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 21日 星期二 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 20日 星期一 18:00:56 CST
weekmon 2014年 10月 20日 星期一 00:00:00 CST

Nowdate: 2014年 10月 19日 星期日 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 18日 星期六 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 17日 星期五 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 16日 星期四 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 15日 星期三 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 14日 星期二 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 13日 星期一 18:00:56 CST
weekmon 2014年 10月 13日 星期一 00:00:00 CST

Nowdate: 2014年 10月 12日 星期日 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 11日 星期六 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 10日 星期五 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 09日 星期四 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 08日 星期三 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 07日 星期二 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 06日 星期一 18:00:56 CST
weekmon 2014年 10月 06日 星期一 00:00:00 CST

Nowdate: 2014年 10月 05日 星期日 18:00:57 CST
weekmon 2014年 09月 29日 星期一 00:00:00 CST

Nowdate: 2014年 10月 04日 星期六 18:00:57 CST
weekmon 2014年 09月 29日 星期一 00:00:00 CST

Nowdate: 2014年 10月 03日 星期五 18:00:57 CST
weekmon 2014年 09月 29日 星期一 00:00:00 CST

Nowdate: 2014年 10月 02日 星期四 18:00:57 CST
weekmon 2014年 09月 29日 星期一 00:00:00 CST

Nowdate: 2014年 10月 01日 星期三 18:00:57 CST
weekmon 2014年 09月 29日 星期一 00:00:00 CST

Nowdate: 2014年 09月 30日 星期二 18:00:57 CST
weekmon 2014年 09月 29日 星期一 00:00:00 CST

tsecer @harry: for  (( day = 0; day <=40; day++));  do echo Nowdate: $(date -d"$day day" ); echo weekmon $( date   -d@$(( ($( date -d"$day day" +%s) - (24 * 3 + 16) * 60 * 60)/(60 * 60 * 24 * 7) * (60 * 60 * 24 * 7)  + (24 * 3 + 16) * 60 * 60)));echo ; done 
Nowdate: 2014年 11月 09日 星期日 18:01:02 CST
weekmon 2014年 11月 03日 星期一 00:00:00 CST

Nowdate: 2014年 11月 10日 星期一 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 11日 星期二 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 12日 星期三 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 13日 星期四 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 14日 星期五 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 15日 星期六 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 16日 星期日 18:01:02 CST
weekmon 2014年 11月 10日 星期一 00:00:00 CST

Nowdate: 2014年 11月 17日 星期一 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 18日 星期二 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 19日 星期三 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 20日 星期四 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 21日 星期五 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 22日 星期六 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 23日 星期日 18:01:03 CST
weekmon 2014年 11月 17日 星期一 00:00:00 CST

Nowdate: 2014年 11月 24日 星期一 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 11月 25日 星期二 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 11月 26日 星期三 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 11月 27日 星期四 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 11月 28日 星期五 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 11月 29日 星期六 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 11月 30日 星期日 18:01:03 CST
weekmon 2014年 11月 24日 星期一 00:00:00 CST

Nowdate: 2014年 12月 01日 星期一 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 02日 星期二 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 03日 星期三 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 04日 星期四 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 05日 星期五 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 06日 星期六 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 07日 星期日 18:01:03 CST
weekmon 2014年 12月 01日 星期一 00:00:00 CST

Nowdate: 2014年 12月 08日 星期一 18:01:03 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 09日 星期二 18:01:03 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 10日 星期三 18:01:03 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 11日 星期四 18:01:03 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 12日 星期五 18:01:03 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 13日 星期六 18:01:03 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 14日 星期日 18:01:04 CST
weekmon 2014年 12月 08日 星期一 00:00:00 CST

Nowdate: 2014年 12月 15日 星期一 18:01:04 CST
weekmon 2014年 12月 15日 星期一 00:00:00 CST

Nowdate: 2014年 12月 16日 星期二 18:01:04 CST
weekmon 2014年 12月 15日 星期一 00:00:00 CST

Nowdate: 2014年 12月 17日 星期三 18:01:04 CST
weekmon 2014年 12月 15日 星期一 00:00:00 CST

Nowdate: 2014年 12月 18日 星期四 18:01:04 CST
weekmon 2014年 12月 15日 星期一 00:00:00 CST

Nowdate: 2014年 12月 19日 星期五 18:01:04 CST
weekmon 2014年 12月 15日 星期一 00:00:00 CST

tsecer @harry: 
  评论这张
 
阅读(264)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017