如何在MATLAB中实现calendarDuration与文本的互转?
MATLAB中calendarDuration与文本的互转(用于生成可执行.m文件)
场景说明
你有一个calendarDuration类型的变量(例如D=calweeks(1);,对应7天),需要将其转为文本后再还原,最终目的是生成可被其他.m文件执行的代码。
1. 将calendarDuration转为文本
如果只需要保留天数信息,用string(D, 'mdt')可以直接得到带单位的字符串,例如:
D = calweeks(1); str = string(D, 'mdt'); % 得到 "7d"
如果是为了生成可执行代码,更推荐直接转为MATLAB可执行的代码字符串(无需后续解析):
D = calweeks(1); days_num = days(D); % 提取总天数(整数) code_str = sprintf('caldays(%d)', days_num); % 得到 "caldays(7)"
2. 将文本还原为calendarDuration
方法一:针对纯天数字符串(如"7d")
直接提取字符串中的数字部分,调用caldays构造:
str = "7d"; num_days = str2double(str(1:end-1)); % 提取"7d"中的数字7 D_restore = caldays(num_days); % 得到calendarDuration类型的7天
方法二:通用多单位解析(支持d/w/mo/y)
如果字符串可能包含其他单位(如"2w"代表2周、"1mo"代表1个月),可以拆分单位后匹配构造函数:
str = "2w"; [num_str, unit] = split(str, {'d','w','mo','y'}, 'CollapseDelimiters', true); num = str2double(num_str); switch lower(unit) case 'd' D_restore = caldays(num); case 'w' D_restore = calweeks(num); case 'mo' D_restore = calmonths(num); case 'y' D_restore = calyears(num); end
方法三:直接执行生成的代码字符串(适合.m文件场景)
如果生成文本时已经转为MATLAB代码格式(如"caldays(7)"),可以直接用eval执行,或者写入.m文件后运行:
% 假设从文件读取或生成了代码字符串 code_str = "caldays(7)"; D_restore = eval(code_str);
注意:如果代码字符串来源不可控,
eval存在安全风险,但你是自己生成的代码,完全可控的情况下可以放心使用。
关键提示
duration(string(D))得到的是duration类型,和calendarDuration是不同的MATLAB类型,前者是精确的时间长度,后者是日历相关的时长(比如月份天数不固定),所以不能用duration函数还原calendarDuration。
内容的提问来源于stack exchange,提问作者Argyll
相关产品推荐
相关产品推荐

