Limits in hours in date vectors (datevec function)
4 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaire
Kirby Fears
le 3 Fév 2016
Modifié(e) : Kirby Fears
le 3 Fév 2016
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.
Réponse acceptée
Kirby Fears
le 3 Fév 2016
Modifié(e) : Kirby Fears
le 3 Fév 2016
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 commentaires
Plus de réponses (1)
Voir également
Catégories
En savoir plus sur Time Series Objects dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!