使用dwm显示时间时,因装arch和windows双系统总导致date显示的时间不对。仔细查看时间是跨了个时区,为此写了个小代码改回正确的时间。
- 编写代码
由于对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
- 写入.xinitrc配置文件
#show-time
while true; do
xsetroot -name "$(~/code/show_date "$( date +"%F %R")" )" # 注意执行文件的位置
sleep 1m # Update time every minute
done &
- 显示如下
最后,感谢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;//返回转换后的字符串
}