diff --git a/README.md b/README.md index ed54dae..e5ced5f 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ # timeData目录 获取各种本地时间与世界时间,以及本地时间与世界时间相互转换的时间函数封装 -# uuidMd5 目录 +# md5 目录 封装了Md5UUid的函数 # comMisc目录 diff --git a/include/utTime.hrl b/include/utTime.hrl index f72f8c8..557906c 100644 --- a/include/utTime.hrl +++ b/include/utTime.hrl @@ -4,4 +4,18 @@ -define(SECS_WEEK, 604800). %% 一周的时间(秒) -define(DAYS_NO_LEAP_YEAR, 365). %% 平年天数 -define(DAYS_LEAP_YEAR, 366). %% 闰年天数 --define(SECS_1970, 62167219200). %% utc 1970年经历过的秒数 \ No newline at end of file +-define(SECS_1970, 62167219200). %% utc 1970年经历过的秒数 + +-type year() :: non_neg_integer(). +-type month() :: 1..12. +-type day() :: 1..31. +-type hour() :: 0..23. +-type minute() :: 0..59. +-type second() :: 0..59. +-type date() :: {year(), month(), day()}. +-type time() :: {hour(), minute(), second()}. +-type datetime() :: {date(), time()}. +-type timestamp() :: non_neg_integer(). %% 时间戳 +-type week() :: 1..7. +-type weekCycle() :: 1..53. %% 一年最多53个周 +-type yearWeekCycle() :: {year(), weekCycle()}. diff --git a/src/uuidMd5/utMd5.erl b/src/md5/utMd5.erl similarity index 67% rename from src/uuidMd5/utMd5.erl rename to src/md5/utMd5.erl index 865ea3a..d11bf3f 100644 --- a/src/uuidMd5/utMd5.erl +++ b/src/md5/utMd5.erl @@ -1,6 +1,14 @@ -module(utMd5). --compile([export_all, nowarn_export_all]). +-export([ + getMd5/1 %% 获取md5码 + , getMd5Hex/1 %% 获取hex str格式的Md5码 + , getMd5HexBin/1 %% 获取hex binary 格式的Md5码 + , md5BinToHex/1 %% md5 to hex str + , md5BinToHexBin/1 %% %% md5 to hex binary + , hexToMd5Bin/1 %% hex str to md5 + , hexBinToMd5Bin/1 %% %% hex binary to md5 +]). -spec getMd5(Str :: iodata()) -> binary(). getMd5(Str) -> diff --git a/src/srvNodeMgr/mtop.erl b/src/srvNodeMgr/mtop.erl index b23b6e9..415fa6b 100644 --- a/src/srvNodeMgr/mtop.erl +++ b/src/srvNodeMgr/mtop.erl @@ -21,30 +21,26 @@ -define(PROCFORM, "~-15w~-20s~8w~8w~8w~8w ~-20s~n"). --record(mtop_info, -{now = {0, 0, 0}, +-record(mtop_info, { + now = {0, 0, 0}, n_procs = 0, wall_clock = {0, 0}, runtime = {0, 0}, run_queue = 0, alloc_areas = [], - memi = [{total, 0}, - {processes, 0}, - {ets, 0}, - {atom, 0}, - {code, 0}, - {binary, 0}], + memi = [{total, 0}, {processes, 0}, {ets, 0}, {atom, 0}, {code, 0}, {binary, 0}], procinfo = [] }). --record(mtop_proc_info, -{pid, +-record(mtop_proc_info, { + pid, mem = 0, reds = 0, name, runtime = 0, cf, - mq = 0}). + mq = 0 +}). -record(opts, {lines = 10, sort = msg_q}). diff --git a/src/srvNodeMgr/utVMInfo.erl b/src/srvNodeMgr/utVMInfo.erl index a2628f7..36f7693 100644 --- a/src/srvNodeMgr/utVMInfo.erl +++ b/src/srvNodeMgr/utVMInfo.erl @@ -51,7 +51,8 @@ etop_stop() -> %% 对所有process做gc %% 进程内存过高时,来一发,看看是内存泄露还是gc不过来 gc_all() -> - [erlang:garbage_collect(Pid) || Pid <- processes()]. + [erlang:garbage_collect(Pid) || Pid <- processes()], + ok. %% 对MFA 执行分析,会严重减缓运行,建议只对小量业务执行 %% 结果: diff --git a/src/stackStrace/utParseStack.erl b/src/stackStrace/utParseStack.erl index 49a016f..9dbace2 100644 --- a/src/stackStrace/utParseStack.erl +++ b/src/stackStrace/utParseStack.erl @@ -1,7 +1,13 @@ -module(utParseStack). + -include("utParseStack.hrl"). --compile([export_all, nowarn_export_all]). +-export([ + parseStack/1 %% 堆栈格式美化函数 + , parseStack/3 %% Class Reason 堆栈格式美化函数 + , printStack/1 %% 打印当前堆栈 + , testStack/1 %% 相关测试函数 +]). %% 堆栈回溯(stacktrace)是{Module,Function,Arity,Location}元组的列表。 %% Arity: 根据异常,Arity字段可以是该函数调用的参数列表,而不是arity整数。 @@ -10,26 +16,14 @@ %% [{file, 一个字符串, 代表函数源文件的文件名}, {line, 元组的第二个元素是发生异常或调用函数的源文件中的行号, 整数> 0} : %% term序列化, term转为string -term_to_string(Bin) when is_binary(Bin) -> +termToStr(Bin) when is_binary(Bin) -> binary_to_list(Bin); -term_to_string(Term) -> +termToStr(Term) -> case catch io_lib:format("~w", [Term]) of {'EXIT', _} -> lists:flatten(io_lib:format("~p", [Term])); GoodString -> lists:flatten(GoodString) end. -%% term反序列化, string转换为term -string_to_term(String) -> - case erl_scan:string(String ++ ".") of - {ok, Tokens, _} -> - case erl_parse:parse_term(Tokens) of - {ok, Term} -> Term; - _Err -> String - end; - _Error -> - undefined - end. - parseStack(Stacktrace, Class, Reason) -> CR = io_lib:format("~n Class:~s~n Reason:~p~n Stacktrace:", [Class, Reason]), [CR | parseStack(Stacktrace)]. @@ -38,11 +32,11 @@ parseStack(Stacktrace) -> [begin case Location of [] -> - [<<"\n ">>, atom_to_list(Mod), <<":">>, atom_to_list(Func), <<"(">>, term_to_string(Arity), <<")">>]; + [<<"\n ">>, atom_to_list(Mod), <<":">>, atom_to_list(Func), <<"(">>, termToStr(Arity), <<")">>]; [{file, File}, {line, Line}] -> [<<"\n ">>, atom_to_list(Mod), <<":">>, atom_to_list(Func), <<"/">>, integer_to_binary(Arity), <<" (">>, File, <<":">>, integer_to_binary(Line), <<")">>]; _ -> - [<<"\n ">>, atom_to_list(Mod), <<":">>, atom_to_list(Func), <<" (">>, term_to_string(Arity), <<")">>, term_to_string(Location)] + [<<"\n ">>, atom_to_list(Mod), <<":">>, atom_to_list(Func), <<" (">>, termToStr(Arity), <<")">>, termToStr(Location)] end end || {Mod, Func, Arity, Location} <- Stacktrace ]. @@ -60,7 +54,7 @@ bad_arity() -> bad_arg(ErrArgs) -> integer_to_list(ErrArgs). -test11(Index) -> +testStack(Index) -> application:set_env(lager, reverse_pretty_stacktrace, false), try case Index of diff --git a/src/testCase/utMakeExport.erl b/src/testCase/utMakeExport.erl new file mode 100644 index 0000000..f80dba3 --- /dev/null +++ b/src/testCase/utMakeExport.erl @@ -0,0 +1,33 @@ +-module(utMakeExport). + +-export([makeExport/1]). + +makeExport(SrcFile) -> + case file:open(SrcFile, [read, binary]) of + {ok, IoDevice} -> + BinStr = doMathEveryLine(IoDevice, "", <<>>), + file:close(IoDevice), + file:write_file("export.config", BinStr); + _ -> + false + end. + +doMathEveryLine(IoDevice, Comment, BinStr) -> + case file:read_line(IoDevice) of + {ok, Data} -> + case re:run(Data, "%%") of + {match, _} -> + doMathEveryLine(IoDevice, Data, BinStr); + _ -> + case re:run(Data, "-spec") of + {match, _} -> + {ok, DataFun} = file:read_line(IoDevice), + DataFunStr = binary:replace(DataFun, <<"->\n">>, <<"">>), + doMathEveryLine(IoDevice, "", <>); + _ -> + doMathEveryLine(IoDevice, Comment, BinStr) + end + end; + _ -> + BinStr + end. diff --git a/src/timeDate/utTime.erl b/src/timeDate/utTime.erl index 587aa9b..faa4c76 100644 --- a/src/timeDate/utTime.erl +++ b/src/timeDate/utTime.erl @@ -1,27 +1,112 @@ -module(utTime). -include("utTime.hrl"). --compile([export_all, nowarn_export_all]). - --type year() :: non_neg_integer(). --type month() :: 1..12. --type day() :: 1..31. --type hour() :: 0..23. --type minute() :: 0..59. --type second() :: 0..59. --type date() :: {year(), month(), day()}. --type time() :: {hour(), minute(), second()}. --type datetime() :: {date(), time()}. --type timestamp() :: non_neg_integer(). %% 时间戳 --type week() :: 1..7. --type weekCycle() :: 1..53. %% 一年最多53个周 --type yearWeekCycle() :: {year(), weekCycle()}. - --import(calendar, -[ -day_of_the_week/1 -, iso_week_number/1 -, date_to_gregorian_days/1 +-import(calendar, [day_of_the_week/1, iso_week_number/1, date_to_gregorian_days/1]). + +-export([ + now/0 %% 当前的时间戳 秒 + , nowMs/0 %% 当前的时间戳 毫秒 + , curDateTime/0 %% 当前的日期 + , curDate/0 %% 当前的年月日 + , curTime/0 %% 当前的时分秒 + , weekDay/0 %% 当前星期几 + , weekDay/1 %% 计算Data是星期几 + , weekDay/3 %% 计算 年 月 日 是星期几 + , weekCycle/0 %% 计算当前的星期周期 + , weekCycle/1 %% 计算 Date 的星期周期 + , secToLDateTime/1 %% 将秒单位的时间戳 转为本地 datetime() + , secToUDateTime/1 %% 将秒单位的时间戳 转为世界 datetime() + , lDateTimeToSec/1 %% 将本地的 datetime() 转为秒单位的时间戳 + , uDateTimeToSec/1 %% 将世界的 datetime() 转为秒单位的时间戳 + , timeZoneDiff/0 %% 获取本地时区与UTC时区 时间差 单位秒 由于某些时区存在夏令时 下面的计算在不同时候 可能会返回不同的值 所以并不能只计算一次 需要在每次用到的时候 重新计算 + , countLDay/1 %% 计算1970年到Sec 本地经过了多少天 + , countUDay/1 %% 计算1970年到Sec 世界经过了多少天 + , isSameLDay/2 %% 判断两个时间戳是否为本地的同一天 + , isSameUDay/2 %% 判断两个时间戳是否为本地的同一天 + , countLWeek/1 %% 计算1970年到Sec 本地经过了多少周 + , countUWeek/1 %% 计算1970年到Sec 世界经过了多少周 + , isSameLWeek/2 %% 判断两个时间戳是否为本地的同一周 + , isSameUWeek/2 %% 判断两个时间戳是否为本地的同一周 + , isSameLMonth/2 %% 判断两个时间戳是否为本地的同一月 + , isSameUMonth/2 %% 判断两个时间戳是否为世界的同一月 + , countLDay/2 %% 计算1970年到Sec 本地经过了多少天 ZeroOffset为零点偏移时间 + , countUDay/2 %% 计算1970年到Sec 世界经过了多少天 ZeroOffset为零点偏移时间 + , isSameLDay/3 %% 判断两个时间戳是否为同一天 ZeroOffset为零点偏移时间 + , isSameUDay/3 %% 判断两个时间戳是否为同一天 ZeroOffset为零点偏移时间 + , countLWeek/2 %% 计算1970年到Sec 本地经过了多少周 ZeroOffset为零点偏移时间 + , countUWeek/2 %% 计算1970年到Sec 世界经过了多少周 ZeroOffset为零点偏移时间 + , isSameLWeek/3 %% 判断两个时间戳是否为同一周 ZeroOffset为零点偏移时间 + , isSameUWeek/3 %% 判断两个时间戳是否为同一周 ZeroOffset为零点偏移时间 + , isSameLMonth/3 %% 判断两个时间戳是否为本地的同一月 ZeroOffset为零点偏移时间 + , isSameUMonth/3 %% 判断两个时间戳是否为世界的同一月 ZeroOffset为零点偏移时间 + , hourBegin/0 %% 当前小时开始时间戳 + , hourBegin/1 %% Sec所在小时开始时间戳 + , hourEnd/0 %% 当前小时结束时间戳 + , hourEnd/1 %% Sec所在小时结束时间戳 + , dayLBegin/0 %% 本地当前天开始时间戳 + , dayLBegin/1 %% 本地Sec所在天开始时间戳 + , dayUBegin/0 %% 世界Sec所在天开始时间戳 + , dayUBegin/1 %% 世界Sec所在天开始时间戳 + , dayLEnd/0 %% 本地当前天结束时间戳 + , dayLEnd/1 %% 本地Sec所在天结束时间戳 + , dayUEnd/0 %% 世界当前天结束时间戳 + , dayUEnd/1 %% 世界Sec所在天结束时间戳 + , dayLBeginEnd/0 %% 本地当前天开始结束时间戳 + , dayLBeginEnd/1 %% 本地Sec所在天开始结束时间戳 + , dayUBeginEnd/0 %% 世界当前天开始结束时间戳 + , dayUBeginEnd/1 %% 世界Sec所在天开始结束时间戳 + , weekLBegin/0 %% 本地当前周开始时间戳 + , weekLBegin/1 %% 本地Sec所在周开始时间戳 + , weekUBegin/0 %% 世界当前周的开始时间戳 + , weekUBegin/1 %% 世界Sec所在周的开始时间戳 + , weekLEnd/0 %% 本地当前周的结束时间戳 + , weekLEnd/1 %% 本地Sec所在周的结束时间戳 + , weekUEnd/0 %% 世界当前周的开始时间戳 + , weekUEnd/1 %% 世界Sec所在周的结束时间戳 + , weekLBeginEnd/0 %% 本地当前周的开始结束时间戳 + , weekLBeginEnd/1 %% 本地Sec所在周的开始结束时间戳 + , weekUBeginEnd/0 %% 世界当前周的开始结束时间戳 + , weekUBeginEnd/1 %% 世界Sec所在周的开始结束时间戳 + , monthLBegin/0 %% 本地当前月的开始时间戳 + , monthLBegin/1 %% 本地Sec所在月的开始时间戳 + , monthUBegin/0 %% 世界当前月的开始时间戳 + , monthUBegin/1 %% 世界Sec所在月的开始时间戳 + , monthLEnd/0 %% 本地当前月的结束时间戳 + , monthLEnd/1 %% 本地Sec所在月的结束时间戳 + , monthUEnd/0 %% 世界当前周的结束时间戳 + , monthUEnd/1 %% 世界Sec所在月的结束时间戳 + , isLeapYear/1 %% 闰年判断函数 + , monthDay/2 %% 根据 年 月 返回对应月的天数 + , monthSecs/2 %% 根据年月 返回月的总秒数 + , monthLBeginEnd/0 %% 本地当前月的开始结束时间戳 + , monthLBeginEnd/1 %% 本地Sec所在月的开始结束时间戳 + , monthUBeginEnd/0 %% 世界当前月的开始结束时间戳 + , monthUBeginEnd/1 %% 世界Sec所在月的开始结束时间戳 + , sWeekName/1 %% 星期名字缩写 + , lWeekName/1 %% 星期名字全称 + , sMonthName/1 %% 月份名称缩写 + , lMonthName/1 %% 月份名称全称 + , dateNumber/0 %% 年月日的数字version + , dateNumber/1 %% 年月日的数字version + , dateNumber/3 %% 年月日的数字version + , numberDate/1 %% dateNumber 反转 + , secToDayTime/1 %% 秒转为天数 和 time() + , diffLDateTimeSec/2 %% 计算两个本地datetime() 时间差 返回单位 秒 + , diffUDateTimeSec/2 %% 计算两个世界datetime() 时间差 返回单位 秒 + , diffLDateTimeDayTime/2 %% 计算两个本地datetime() 时间差 返回单位 daytime() + , diffUDateTimeDayTime/2 %% 计算两个世界datetime() 时间差 返回单位 daytime() + , diffSecs/2 %% 计算两个秒单位的 时间戳的时间差 返回单位 daytime() + , timeToSecs/1 %% 转换 time() 为 Sec + , daysInYear/1 %% 计算 Date为该年的哪一天 + , dateToStr/1 %% Data to Str + , dateToStr/3 %% Data to Str + , dateToStr/2 %% Data to Str + , dateToStr/4 %% Data to Str + , timeToStr/1 %% time to Str + , timeToStr/3 %% time to Str + , timeToStr/2 %% time to Str + , timeToStr/4 %% time to Str + , dateTimeStr/1 %% datetime to Str ]). %% 当前的时间戳 秒 @@ -75,23 +160,23 @@ weekCycle(Date) -> calendar:iso_week_number(Date). %% 将秒单位的时间戳 转为本地 datetime() --spec secToLocalTime(Sec :: timestamp()) -> datetime(). -secToLocalTime(Ses) -> +-spec secToLDateTime(Sec :: timestamp()) -> datetime(). +secToLDateTime(Ses) -> erlang:universaltime_to_localtime(erlang:posixtime_to_universaltime(Ses)). %% 将秒单位的时间戳 转为世界 datetime() --spec secToUniversalTime(Sec :: timestamp()) -> datetime(). -secToUniversalTime(Ses) -> +-spec secToUDateTime(Sec :: timestamp()) -> datetime(). +secToUDateTime(Ses) -> erlang:posixtime_to_universaltime(Ses). %% 将本地的 datetime() 转为秒单位的时间戳 --spec localTimeToSec(LocalDate :: datetime()) -> timestamp(). -localTimeToSec(LocalDate) -> +-spec lDateTimeToSec(LocalDate :: datetime()) -> timestamp(). +lDateTimeToSec(LocalDate) -> erlang:universaltime_to_posixtime(erlang:localtime_to_universaltime(LocalDate)). %% 将世界的 datetime() 转为秒单位的时间戳 --spec universalTimeToSec(UniversalTime :: datetime()) -> timestamp(). -universalTimeToSec(UniversalTime) -> +-spec uDateTimeToSec(UniversalTime :: datetime()) -> timestamp(). +uDateTimeToSec(UniversalTime) -> erlang:universaltime_to_posixtime(UniversalTime). %% 获取本地时区与UTC时区 时间差 单位秒 由于某些时区存在夏令时 下面的计算在不同时候 可能会返回不同的值 所以并不能只计算一次 需要在每次用到的时候 重新计算 @@ -145,15 +230,15 @@ isSameUWeek(Sec1, Sec2) -> %% 判断两个时间戳是否为本地的同一月 -spec isSameLMonth(Sec1 :: timestamp(), Sec2 :: timestamp()) -> boolean(). isSameLMonth(Sec1, Sec2) -> - {{Year1, Month1, _Day1}, _Time1} = secToLocalTime(Sec1), - {{Year2, Month2, _Day2}, _Time2} = secToLocalTime(Sec2), + {{Year1, Month1, _Day1}, _Time1} = secToLDateTime(Sec1), + {{Year2, Month2, _Day2}, _Time2} = secToLDateTime(Sec2), Month1 =:= Month2 andalso Year1 =:= Year2. %% 判断两个时间戳是否为世界的同一月 -spec isSameUMonth(Sec1 :: timestamp(), Sec2 :: timestamp()) -> boolean(). isSameUMonth(Sec1, Sec2) -> - {{Year1, Month1, _Day1}, _Time1} = secToUniversalTime(Sec1), - {{Year2, Month2, _Day2}, _Time2} = secToUniversalTime(Sec2), + {{Year1, Month1, _Day1}, _Time1} = secToUDateTime(Sec1), + {{Year2, Month2, _Day2}, _Time2} = secToUDateTime(Sec2), Month1 =:= Month2 andalso Year1 =:= Year2. %% 计算1970年到Sec 本地经过了多少天 ZeroOffset为零点偏移时间 @@ -201,15 +286,15 @@ isSameUWeek(Sec1, Sec2, ZeroOffset) -> %% 判断两个时间戳是否为本地的同一月 ZeroOffset为零点偏移时间 -spec isSameLMonth(Sec1 :: timestamp(), Sec2 :: timestamp(), ZeroOffset :: timestamp()) -> boolean(). isSameLMonth(Sec1, Sec2, ZeroOffset) -> - {{Year1, Month1, _Day1}, _Time1} = secToLocalTime(Sec1 - ZeroOffset), - {{Year2, Month2, _Day2}, _Time2} = secToLocalTime(Sec2 - ZeroOffset), + {{Year1, Month1, _Day1}, _Time1} = secToLDateTime(Sec1 - ZeroOffset), + {{Year2, Month2, _Day2}, _Time2} = secToLDateTime(Sec2 - ZeroOffset), Month1 =:= Month2 andalso Year1 =:= Year2. %% 判断两个时间戳是否为世界的同一月 ZeroOffset为零点偏移时间 -spec isSameUMonth(Sec1 :: timestamp(), Sec2 :: timestamp(), ZeroOffset :: timestamp()) -> boolean(). isSameUMonth(Sec1, Sec2, ZeroOffset) -> - {{Year1, Month1, _Day1}, _Time1} = secToUniversalTime(Sec1 - ZeroOffset), - {{Year2, Month2, _Day2}, _Time2} = secToUniversalTime(Sec2 - ZeroOffset), + {{Year1, Month1, _Day1}, _Time1} = secToUDateTime(Sec1 - ZeroOffset), + {{Year2, Month2, _Day2}, _Time2} = secToUDateTime(Sec2 - ZeroOffset), Month1 =:= Month2 andalso Year1 =:= Year2. %% 当前小时开始时间戳 @@ -378,16 +463,16 @@ weekUBeginEnd(Sec) -> -spec monthLBegin() -> timestamp(). monthLBegin() -> Sec = erlang:system_time(second), - {{Year, Month, _Day}, _Time} = secToLocalTime(Sec), + {{Year, Month, _Day}, _Time} = secToLDateTime(Sec), MonthStartDateTime = {{Year, Month, 1}, {0, 0, 0}}, - localTimeToSec(MonthStartDateTime). + lDateTimeToSec(MonthStartDateTime). %% 本地Sec所在月的开始时间戳 -spec monthLBegin(Sec :: timestamp()) -> timestamp(). monthLBegin(Sec) -> - {{Year, Month, _Day}, _Time} = secToLocalTime(Sec), + {{Year, Month, _Day}, _Time} = secToLDateTime(Sec), MonthStartDateTime = {{Year, Month, 1}, {0, 0, 0}}, - localTimeToSec(MonthStartDateTime). + lDateTimeToSec(MonthStartDateTime). %% 世界当前月的开始时间戳 -spec monthUBegin() -> timestamp(). @@ -408,18 +493,18 @@ monthUBegin(Sec) -> -spec monthLEnd() -> timestamp(). monthLEnd() -> Sec = erlang:system_time(second), - {{Year, Month, _Day}, _Time} = secToLocalTime(Sec), + {{Year, Month, _Day}, _Time} = secToLDateTime(Sec), MonthDay = monthDay(Year, Month), MonthEndDateTime = {{Year, Month, MonthDay}, {23, 59, 59}}, - localTimeToSec(MonthEndDateTime). + lDateTimeToSec(MonthEndDateTime). %% 本地Sec所在月的结束时间戳 -spec monthLEnd(Sec :: timestamp()) -> timestamp(). monthLEnd(Sec) -> - {{Year, Month, _Day}, _Time} = secToLocalTime(Sec), + {{Year, Month, _Day}, _Time} = secToLDateTime(Sec), MonthDay = monthDay(Year, Month), MonthEndDateTime = {{Year, Month, MonthDay}, {23, 59, 59}}, - localTimeToSec(MonthEndDateTime). + lDateTimeToSec(MonthEndDateTime). %% 世界当前周的结束时间戳 -spec monthUEnd() -> timestamp(). @@ -475,17 +560,17 @@ monthSecs(_, _) -> -spec monthLBeginEnd() -> timestamp(). monthLBeginEnd() -> Sec = erlang:system_time(second), - {{Year, Month, _Day}, _Time} = secToLocalTime(Sec), + {{Year, Month, _Day}, _Time} = secToLDateTime(Sec), MonthStartDateTime = {{Year, Month, 1}, {0, 0, 0}}, - Begin = localTimeToSec(MonthStartDateTime), + Begin = lDateTimeToSec(MonthStartDateTime), {Begin, Begin + monthSecs(Year, Month)}. %% 本地Sec所在月的开始结束时间戳 -spec monthLBeginEnd(Sec :: timestamp()) -> timestamp(). monthLBeginEnd(Sec) -> - {{Year, Month, _Day}, _Time} = secToLocalTime(Sec), + {{Year, Month, _Day}, _Time} = secToLDateTime(Sec), MonthStartDateTime = {{Year, Month, 1}, {0, 0, 0}}, - Begin = localTimeToSec(MonthStartDateTime), + Begin = lDateTimeToSec(MonthStartDateTime), {Begin, Begin + monthSecs(Year, Month)}. %% 世界当前月的开始结束时间戳 @@ -593,25 +678,25 @@ secToDayTime(Secs) -> %% 计算两个本地datetime() 时间差 单位 秒 -spec diffLDateTimeSec(datetime(), datetime()) -> timestamp(). diffLDateTimeSec(DateTime1, DateTime2) -> - Secs = localTimeToSec(DateTime1) - localTimeToSec(DateTime2), + Secs = lDateTimeToSec(DateTime1) - lDateTimeToSec(DateTime2), erlang:abs(Secs). %% 计算两个世界datetime() 时间差 单位 秒 -spec diffUDateTimeSec(datetime(), datetime()) -> timestamp(). diffUDateTimeSec(DateTime1, DateTime2) -> - Secs = universalTimeToSec(DateTime1) - universalTimeToSec(DateTime2), + Secs = uDateTimeToSec(DateTime1) - uDateTimeToSec(DateTime2), erlang:abs(Secs). %% 计算两个本地datetime() 时间差 单位 daytime() -spec diffLDateTimeDayTime(datetime(), datetime()) -> timestamp(). diffLDateTimeDayTime(DateTime1, DateTime2) -> - Secs = localTimeToSec(DateTime1) - localTimeToSec(DateTime2), + Secs = lDateTimeToSec(DateTime1) - lDateTimeToSec(DateTime2), secToDayTime(erlang:abs(Secs)). %% 计算两个世界datetime() 时间差 单位 daytime() -spec diffUDateTimeDayTime(datetime(), datetime()) -> timestamp(). diffUDateTimeDayTime(DateTime1, DateTime2) -> - Secs = universalTimeToSec(DateTime1) - universalTimeToSec(DateTime2), + Secs = uDateTimeToSec(DateTime1) - uDateTimeToSec(DateTime2), secToDayTime(erlang:abs(Secs)). %% 计算两个秒单位的 时间戳 的时间差 单位 daytime() @@ -627,48 +712,57 @@ timeToSecs({H, M, S}) -> %% 计算 Date为该年的哪一天 -spec daysInYear(date()) -> integer(). daysInYear({Y, _, _} = Date) -> - date_to_gregorian_days(Date) - date_to_gregorian_days({Y, 1, 1}). + calendar:date_to_gregorian_days(Date) - calendar:date_to_gregorian_days({Y, 1, 1}). +%% Data to Str -spec dateToStr(date()) -> string(). dateToStr({Year, Month, Day}) -> S = io_lib:format("~B_~2.10.0B_~2.10.0B", [Year, Month, Day]), lists:flatten(S). +%% Data to Str -spec dateToStr(year(), month(), day()) -> string(). dateToStr(Year, Month, Day) -> S = io_lib:format("~B_~2.10.0B_~2.10.0B", [Year, Month, Day]), lists:flatten(S). +%% Data to Str -spec dateToStr(date(), string()) -> string(). dateToStr({Year, Month, Day}, Separator) -> S = io_lib:format("~B~w~2.10.0B~w~2.10.0B", [Year, Separator, Month, Separator, Day]), lists:flatten(S). +%% Data to Str -spec dateToStr(year(), month(), day(), string()) -> string(). dateToStr(Year, Month, Day, Separator) -> S = io_lib:format("~B~w~2.10.0B~w~2.10.0B", [Year, Separator, Month, Separator, Day]), lists:flatten(S). +%% time to Str -spec timeToStr(time()) -> string(). timeToStr({Hour, Minute, Second}) -> S = io_lib:format("~B:~2.10.0B:~2.10.0B", [Hour, Minute, Second]), lists:flatten(S). +%% time to Str -spec timeToStr(hour(), minute(), second()) -> string(). timeToStr(Hour, Minute, Second) -> S = io_lib:format("~B:~2.10.0B:~2.10.0B", [Hour, Minute, Second]), lists:flatten(S). +%% time to Str -spec timeToStr(time(), string()) -> string(). timeToStr({Hour, Minute, Second}, Separator) -> S = io_lib:format("~B~w~2.10.0B~w~2.10.0B", [Hour, Separator, Minute, Separator, Second]), lists:flatten(S). +%% time to Str -spec timeToStr(hour(), minute(), second(), string()) -> string(). timeToStr(Hour, Minute, Second, Separator) -> S = io_lib:format("~B~w~2.10.0B~w~2.10.0B", [Hour, Separator, Minute, Separator, Second]), lists:flatten(S). +%% datetime to Str -spec dateTimeStr(datetime()) -> string(). dateTimeStr({{Year, Month, Day}, {Hour, Minute, Second}}) -> S = io_lib:format("~B_~2.10.0B_~2.10.0B ~B:~2.10.0B:~2.10.0B", [Year, Month, Day, Hour, Minute, Second]), diff --git a/src/uuidMd5/utUuid.erl b/src/uuid/utUuid.erl similarity index 74% rename from src/uuidMd5/utUuid.erl rename to src/uuid/utUuid.erl index 84851ce..742978c 100644 --- a/src/uuidMd5/utUuid.erl +++ b/src/uuid/utUuid.erl @@ -1,6 +1,10 @@ -module(utUuid). --compile([export_all, nowarn_export_all]). +-export([ + randStr/1 %% 随机指定长度的字符串 + , uuid/0 %% 获取唯一UUID + , uuidHex/0 %% 获取hex格式的唯一UUID +]). -spec randStr(integer()) -> string(). randStr(Length) -> @@ -17,10 +21,10 @@ randStr(Length) -> end end || _ <- lists:seq(1, Length)]. --spec uuid() -> binary. +-spec uuid() -> binary(). uuid() -> erlang:md5(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()})). --spec uuidHex() -> binary. +-spec uuidHex() -> binary(). uuidHex() -> utMd5:getMd5Hex(term_to_binary({erlang:system_time(nanosecond), rand:uniform(134217727), make_ref()})).