Limits in hours in date vectors (datevec function)
조회 수: 4 (최근 30일)
이전 댓글 표시
Hello, I was wondering what are the true carryover limits to the date vectors. For instance, when I insert: A = [2000,1,1,30,0,0]; B = datestr(A); MATLAB understands that this is the 6th hour of the next day and correctly returns: '02-Jan-2000 06:00:00' Then if you return it as C = datevec(B); the date vector will have been fixed to the MATLAB format.
But if you insert something more extravagant, yet reasonable such as A = [2000,1,1,500,0,0]; (the 500th hour after the start of 01/01/2000), then datestr does not return a valid value. There appears to be a limit somewhere, even within the same month. Do you know the limits to this? One can easily make a workaround with a custom script, but MATLAB is supposed to do the carryover automatically.
댓글 수: 1
Kirby Fears
2016년 2월 3일
편집: Kirby Fears
2016년 2월 3일
I did some initial tests and found a limit for negative hours as well. However, the limit I find varies depending on the date I start with. Will post an answer if I find the actual cause.
I found that using datestr(datenum(A)) works in your example, so this appears to be a datestr(datevec) quirk.
채택된 답변
Kirby Fears
2016년 2월 3일
편집: Kirby Fears
2016년 2월 3일
This appears to be a bug in datestr() which you can report to Mathworks support.
In Matlab 2015a, datestr line 166 has an if statement including the following logic:
&&...
all(abs(sum(D,2)-2000)<500))
Where D is the datevector input (which is your variable A). The A you have specified fails this condition, which leads to these two lines executing:
% datestr() mistakenly thinks D is a datenum
(line 174): dtnumber = D;
(line 183): dtnumber = dtnumber(:);
This is why you're getting a vector (6 long) of weird dates back. It's converting each of your datevec fields to a datestr as if they were datenums. This same bug would be encountered if you input a datevector for the year 2501 because of the conditional statement used to distinguish datenums from datevecs.
E.g. This should give you 6 wrong date strings instead of Jan 1, 2501
A = [2501 1 1 0 0 0]; disp(datestr(A));
An immediate workaround is to call datestr(datenum(A)).
A fix by Mathworks would involve revisiting the conditional in line 166 which is misidentifying your datevec as a datenum. If it were properly identified as a datevec, it would actually be put through the datenum function within datestr. Thus calling datestr(datenum(A)) yourself is a good workaround.
Hope this helps.
댓글 수: 0
추가 답변 (1개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Time Series Objects에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!