dwm显示时间多8小时怎么办

使用dwm显示时间时,因装arch和windows双系统总导致date显示的时间不对。仔细查看时间是跨了个时区,为此写了个小代码改回正确的时间。

  1. 编写代码

由于对shell基本不会,就用c语言来写,虽然说c也不熟

我将此文件取名为show_date.c,下面需要此文件的位置

#include<stdio.h>
int main(int argc,char *argv[]){
    // 声明各个时间数值变量
   int year,month,day,hour,minute;
   // 取出时间数值,并转换为整形
   sscanf(argv[1],"%d-%d-%d %d:%d",&year,&month,&day,&hour,&minute);

    // 将时间-8小时
    
    // 如果小时数大于等于8
    if(hour >=8) hour -= 8;
    else {
        hour += 16; // 24-8+hour
        // 如果日期不是1
        if(day != 1) day--;
        else {
            // 如果月份不等于1
            if(month != 1 ) {
                month--; // 月份-1
                // 如果不是2月
                if(month != 2){
                    // 如果不是大月
                    if(month%2 == 0 && month<8 || month%2 == 1 && month>8) day = 30;
                    else day = 31;
                }
                // 如果是2月
                else {
                    // 如果不是润年
                    if(!(year%4 == 0 && year%100 !=0 || year%400 == 0)) day = 28;
                    else day = 29;
                }
            }
            // 如果月份是1
            else{
                year--;
                month = 12;
                day = 31;
            }
        }
    }

    // 输出时间
    printf("%d-%d-%d %d:%d",year,month,day,hour,minute);
    return 0;
}

  • 缺点:个位整形输出时无0,如03
  1. 写入.xinitrc配置文件
#show-time
while true; do
   xsetroot -name "$(~/code/show_date "$( date +"%F %R")" )" # 注意执行文件的位置
   sleep 1m    # Update time every minute
done &
  1. 显示如下
    时间显示

最后,感谢c百度贴吧里大佬的解惑

下面是第一次写的代码,只确保显示正确时hour,能输出0

#include<stdio.h>
#include<stdlib.h>

// 函数声明
char* itoa(int num,char* str,int radix);

// 传入时间参数,将小时位-8个小时,转换为正确的时区
int main(int argc , char *argv[]) {

// 遍历传入参数的字符串,将其放入到创建的字符数组中.已知传入字符串长度为16
    char date[17];
    date[17] = '\0';

    int i; // 计数变量

    char hour[3]; // 需要截取小时位的容器
    hour[0] = '\0';

    for(i=0;i<16;i++) date[i] = argv[1][i]; // 将传入的参数复制给date
    
   // 取出11、12位,时位,转化为数字
   hour[0] = argv[1][11];
   hour[1] = argv[1][12];

   i = atoi(hour); // 将小时位转换为int型

//-----------------------------------------------------------------------
   
   // 换成正确的时间,-8小时的时区
   
   // 当时位大于等于8时
   if( i >= 8 ) {
       i -= 8;
   }
   // 小于8时,用24-8+当前时位; 涉及到日和年,就先这样吧
   else i += 16;
   
//-----------------------------------------------------------------------
    // 将数字转换为字符串并放回去
   itoa(i,hour,10);
   date[11] = hour[0];
   date[12] = hour[1];

 printf("%s\n",date);
 
    return 0;
}

// linux没有itoa函数,我复制下
char* itoa(int num,char* str,int radix)
{
    char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//索引表
    unsigned unum;//存放要转换的整数的绝对值,转换的整数可能是负数
    int i=0,j,k;//i用来指示设置字符串相应位,转换之后i其实就是字符串的长度;转换后顺序是逆序的,有正负的情况,k用来指示调整顺序的开始位置;j用来指示调整顺序时的交换。
 
    //获取要转换的整数的绝对值
    if(radix==10&&num<0)//要转换成十进制数并且是负数
    {
        unum=(unsigned)-num;//将num的绝对值赋给unum
        str[i++]='-';//在字符串最前面设置为'-'号,并且索引加1
    }
    else unum=(unsigned)num;//若是num为正,直接赋值给unum
 
    //转换部分,注意转换后是逆序的
    do
    {
        str[i++]=index[unum%(unsigned)radix];//取unum的最后一位,并设置为str对应位,指示索引加1
        unum/=radix;//unum去掉最后一位
 
    }while(unum);//直至unum为0退出循环
 
    str[i]='\0';//在字符串最后添加'\0'字符,c语言字符串以'\0'结束。
 
    //将顺序调整过来
    if(str[0]=='-') k=1;//如果是负数,符号不用调整,从符号后面开始调整
    else k=0;//不是负数,全部都要调整
 
    char temp;//临时变量,交换两个值时用到
    for(j=k;j<=(i-1)/2;j++)//头尾一一对称交换,i其实就是字符串的长度,索引最大值比长度少1
    {
        temp=str[j];//头部赋值给临时变量
        str[j]=str[i-1+k-j];//尾部赋值给头部
        str[i-1+k-j]=temp;//将临时变量的值(其实就是之前的头部值)赋给尾部
    }
 
    return str;//返回转换后的字符串
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值