首页 > 其他分享 >C语言月份字符转月份数值实现

C语言月份字符转月份数值实现

时间:2024-04-12 16:14:56浏览次数:18  
标签:字符 月份 MONTH char num result time C语言 DEF

这里直接利用的宏就可以实现,月份字符串转月份数值功能,例如将“jan” 转为数字1,即1月份。

datetime.h

#ifndef __DATETIME_H_
#define __DATETIME_H_

#include <rtthread.h>


#define MONTH_TABLE() \
    DEF_MONTH(Jan) \
    DEF_MONTH(Feb) \
    DEF_MONTH(Mar) \
    DEF_MONTH(Apr) \
    DEF_MONTH(May) \
    DEF_MONTH(Jun) \
    DEF_MONTH(Jul) \
    DEF_MONTH(Aug) \
    DEF_MONTH(Oct) \
    DEF_MONTH(Nov) \
    DEF_MONTH(Dec) 


//定义月份枚举,其枚举元素名和月份缩略字符串同名
typedef enum 
{
    E_MONTH_START = 0,
#define DEF_MONTH(v) v,
    MONTH_TABLE()     
#undef DEF_MONTH
    E_MONTH_END,
}E_MONTH;

//这里实现了几个实用的函数
uint32_t datetimeToUtc(const char* date, const char*time);
void datetimeFormat(const char* date, char*out);
uint32_t versionStrToInt(const char* version);

#endif

datetime.c

#include "datetime.h"
#include <stdio.h>
 #include <string.h>
#include <time.h>
#include "log.h"


//巧用'#'符,直接将枚举转为对应字符串
const char* MonthStringOf(E_MONTH c) {
    switch (c) {
#define DEF_MONTH(v) \
        case v: \
            return #v;
        MONTH_TABLE()
#undef DEF_MONTH
      default:
        return "Unknown";
    }
}

//同理,这里使用'#'符,将枚举转化为字符串后,在和输入参数比较,相等则返回该月份缩略字符串代表的月份数值
int getMonthNumber(const char* month) {
#define DEF_MONTH(v) \
        if(0 == rt_strcmp(#v, month)) return v;
        MONTH_TABLE()
#undef DEF_MONTH
}

void mySplit(const char *src, const char *separator, char dest[][20], int *num)
{
    char *pPre = NULL;
    char *pNext = NULL;

     //记录分隔符数量
     int count = 0;
     //原字符串为空
     if (src == NULL || strlen(src) == 0)
        return;
    //未输入分隔符
     if (separator == NULL || strlen(separator) == 0)
        return;

     //获得第一个由分隔符分割的字符串
    pNext = strtok(src,separator);
    while(pNext != NULL) {
        //存入到目的字符串数组中
        pPre = pNext;
        pNext = strtok(NULL, separator);

        if (pPre && pNext)
        {
            strncpy(dest[count++], pPre, (pNext-pPre-1));
        }
        else if(pPre)
        {
            strcpy(dest[count++], pPre);
        }
    }

    *num = count;
}

//时间字符串转UTC秒数
//date输入格式:Aug 15 2023, time输入格式:11:08:22
uint32_t datetimeToUtc(const char* date, const char*time)
{
    char result[10][20];
    int num = 0;
    struct tm local_time;

    if (date == NULL || time == NULL) return 0;

    rt_memset(&local_time, 0, sizeof(local_time));
    rt_memset(result, 0, sizeof(result));

    mySplit(date, " ", result, &num);
    if (num < 3)
    {
        LOGT("","date:%s num < 3! num=%d\n",date, num);
        return 0;
    }
    else
    {
        local_time.tm_mon = getMonthNumber(result[0]) - 1;
        local_time.tm_mday = atoi(result[1]);
        local_time.tm_year = atoi(result[2]) - 1900;
    }

    rt_memset(result, 0, sizeof(result));
    num = 0;
    mySplit(time, ":", result, &num);
    if (num < 3)
    {
        LOGT("","time:%s num < 3! num=%d\n",time, num);
        return 0;
    }
    else
    {
        local_time.tm_hour = atoi(result[0]);
        local_time.tm_min = atoi(result[1]);
        local_time.tm_sec = atoi(result[2]);
    }

    time_t utc_time = mktime(&local_time);

    return utc_time;
}

//时间字符串格式化输出
//date输入格式:Aug 15 2023, 输出格式:230815
void datetimeFormat(const char* date, char* out)
{
    char result[10][20];
    int num = 0;

    if (date == NULL || time == NULL) return;

    rt_memset(result, 0, sizeof(result));

    mySplit(date, " ", result, &num);
    if (num < 3)
    {
        LOGT("","date:%s num < 3! num=%d\n",date, num);
        return;
    }
    else
    {
        rt_sprintf(out, "%2d%02d%02d", atoi(result[2])%100, getMonthNumber(result[0]), atoi(result[1]));
    }
}


//版本字符串转整数1.3.1 -> 10301 ,次版本号,修订版本号分别占两位数
uint32_t versionStrToInt(const char* version)
{
    char result[10][20];
    int num = 0;
    uint32_t i_vertion = 0;

    if (version == NULL) return 0;
    rt_memset(result, 0, sizeof(result));

    mySplit(version, ".", result, &num);
    if (num < 3)
    {
        LOGT("","version:%s num < 3! num=%d\n",num);
        return 0;
    }
    else
    {
        i_vertion = atoi(result[0])*10000;
        i_vertion += atoi(result[1])*100;
        i_vertion += atoi(result[2]);
    }

    return i_vertion;
}

标签:字符,月份,MONTH,char,num,result,time,C语言,DEF
From: https://www.cnblogs.com/HuangLiDi/p/18131518

相关文章

  • C语言实现split函数
    #include<stdio.h>#include<string.h>voidmySplit(char*src,constchar*separator,chardest[][20],int*num){char*pPre=NULL;char*pNext=NULL;//记录分隔符数量intcount=0;//原字符串为空if(src==NULL||strle......
  • 几种常用数据结构的C语言实现
    队列/*********************************************************************************@file:myfifo.c*@brief:先入先出队列实现*@author:huanglidi*****************************************************************......
  • JSON.parse() 方法中里面有函数,转化完成后是字符串问题
    要将JSON字符串中的函数还原回原来的函数对象,你可以使用JSON.parse()方法,并提供一个reviver函数来将字符串表示的函数重新转换为函数对象。以下是你可以使用的代码示例:varobj={"name":"Runoob","alexa":function(){return10000;},"site":"www.runoob.com"};//......
  • String类型转LPCTSTR -----理解C++中的字符串类型转换
    在看代码时,发现有时候会把string类型转换为LPCTSTR,刚开始不理解为什么要做这个转换,所以做了一些调查,现在记录如下是这样的,STRING是代表C++中的字符串string,而LPCTSTR代表的是Windows系统中的字符串类型。也就是说,这样转换的目的是为了把C++中的字符串string转换为Windows系......
  • C#长sql语句换行(长字符串换行且换行符不计入字符串中)
    示例:在红圈处敲回车vs会将其分段并拼接,这不是我想要的效果、不仅不美观还不好复制sql语句只需要在字符串前加一个@号就可以解决......
  • 27.C语言顺序循环结构结构练习题整理
    参考:https://www.qingsuyun.com/lib/d/600120380038000300010041/6、【单选题】语句while(!e);中的条件!e等价于()。[2分] ***AA、e==0B、e!=1C、e!=0D、~e9、【单选题】以下叙述正确的是()。[2分] ****BA、continue语句的作用是结束整个循环的执行......
  • StringHelper--字符串左右添加指定字符
    StringHelper--字符串左右添加指定字符1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Configuration;4usingSystem.Linq;5usingSystem.Text;6usingSystem.Threading.Tasks;78namespaceHRMessageApp.Helper9{10publiccla......
  • 实验2 C语言分支与循环基础应用编程
    //task1.c#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5intmain(){intnumber;inti;srand(time(0));//以当前系统时间作为随机种子for(i=0;i<N;++i){number=rand()%65+1; printf("20238331%04d\n&......
  • C语言09-指针(指针数组、数组指针、字符指针),值传递和引用传递,指针和函数,注释写法
    第12章指针pointer12.3指针和数组①数组名可以把数组名当做是存储了首元素地址的常量。//arr的类型表示为int[5]intarr[5]={10,20,30,40,50};②指针数组指针数组(PointerArray)是一个数组,其中的每个元素都是指针。intnum1=10,num2=20,num3=30;//ptr_......
  • java中字符串替换的4种方法 replaceAll() 带正则表达式参数 str.replaceAll("[0-9]+
    java中字符串替换的4种方法replaceAll()带正则表达式参数str.replaceAll("[0-9]+","");目录前言一、String的replace()方法二、String的replaceAll()方法三、StringBuffer/StringBuilder的replace()方法四、Matcher的replaceAll()方法总结前言在日常开发中,我们对......