Linux 在文件内读取时间段字符串并解析判断当前时间是否在时间段内 C语言

最近需要实现一个判断当前是否是上班时间段内,但是需要从文件中读取特定的格式时间时间段

格式: 00:00-12:34|13:56-15:00(不确定几个时间段,每个时间段以|分隔)

读取特定格式时间并转化不难但是挺麻烦的

cpp 复制代码
//获得当前中国时区时间
void getNowTime(char* bufTime,int bufTimeLength)
{
  //setTimeZone("Asia/ShangHai");
  time_t now;
  struct tm *info;
  time(&now);
  info = localtime(&now);
  info->tm_hour=(info->tm_hour)+8;
  strftime(bufTime,bufTimeLength,"%Y-%m-%d %H:%M:%S",info);
  return ;
}

//解析时间段 时间段格式 00:00-12:34
void parseTime(const char* timeStr,int* hour,int* minute)
{
  sscanf(timeStr,"%d:%d",hour,minute);
}
void parseTimePar(const char* timeParStr,int* startHour,int* startMinute,int* endHour,int* endMinute)
{
  char startTime[6],endTime[6];
  sscanf(timeParStr,"%5[^-]-%5s",startTime,endTime);
  parseTime(startTime,startHour,startMinute);
  parseTime(endTime,endHour,endMinute);
}

//判断当前时间是否在上班时间
int inWork(int nowHour,int nowMinute,int startHour,int startMinute,int endHour,int endMinute)
{  
  int now = nowHour*60+nowMinute;
  int start = startHour*60+startMinute;
  int end = endHour*60+endMinute;
  //printf("now:%d:%d\nstart:%d:%d\nend:%d:%d\n",nowHour,nowMinute,startHour,startMinute,endHour,endMinute);
  if(start>end)
  {
    printf("startTime>endTime====>now is all day\n");
    return 1;
  }
  if(now>=start&&now<=end)
  {
    return 1;
  }
  return 0;
}

//从文件中读取时间字符串
//格式:00:00-12:34|12:35-12:36|14:33-14:34|...(不确定的多个时间段,每个时间段以|分隔)
int workOrRest()
{
  time_t t1,tim;
  struct tm *p;
  time(&t1);
  p = localtime(&t1);
  int nowHour = (p->tm_hour)+8;
  int nowMinute = p->tm_min;
  int workFlag=0;
  
  FILE *fp;
  char loadFile[256];
  char line[256];
  strcpy(loadFile,"/home/projects/timeSet.txt");
  fp = fopen(loadFile,"r");
  if(fp==NULL)
  {
    printf("can not load file! function in workOrRest\n");
    return -1;
  }
  if(!fgets(line,sizeof(line),fp))
  {
    printf("file error!\n");
    return -1;
  }
  //char* first = strtok(line,"|");
  //if(first)
  //{
  //  printf("%s\n",first);
  //}
  //char* second = NULL;
  char *timeParStr;
  char *ptr = line;
  while((timeParStr = strtok_r(ptr,"|",&ptr)))
  {
    int startHour,startMinute,endHour,endMinute;
    parseTimePar(timeParStr,&startHour,&startMinute,&endHour,&endMinute);
    if(inWork(nowHour,nowMinute,startHour,startMinute,endHour,endMinute))
    {
      workFlag=1;
      break;
    }
    //printf("workFlag:%d\n",workFlag);
  }
  return workFlag;
}

//调用示例
int main()
{
    if(workOrRest())
       printf("上班时间段\n");
    else
       printf("休息时间\n");
}
相关推荐
艾莉丝努力练剑2 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(五)
c语言·开发语言·数据结构·学习·算法
妫以明3 分钟前
特辑:Ubuntu,前世今生
linux·运维·ubuntu
kfepiza10 分钟前
Linux的NetworkManager的nmcli配置网桥(bridge) 笔记250712
linux·运维·网络·笔记·tcp/ip·ip·tcp
麟城Lincoln13 分钟前
【Linux-云原生-笔记】系统引导修复(grub、bios、内核、系统初始化等)
linux·笔记·云原生·bios·grub·系统修复·系统引导
53Hz17 分钟前
【问题记录】kmemleak 定位内存泄露
linux
53Hz18 分钟前
【调试工具】taskset 设置处理器的亲和度
linux
真成运维18 分钟前
生产环境变更 AppSpace存储切换
linux
53Hz23 分钟前
【调试工具】coredump 使用示例
linux
53Hz23 分钟前
【问题记录】进程调度导致 UDP 丢包问题分析
linux
53Hz25 分钟前
【调试工具】pstore 工具配置及使用
linux