]> cloudbase.mooo.com Git - z180-stamp.git/blame - time/iso_week_date_r.c
Adaptions for fatfs R0.12b
[z180-stamp.git] / time / iso_week_date_r.c
CommitLineData
e63b2f75
L
1/*
2 * (c)2012 Michael Duane Rice All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * Redistributions of source code must retain the above copyright notice, this
9 * list of conditions and the following disclaimer. Redistributions in binary
10 * form must reproduce the above copyright notice, this list of conditions
11 * and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution. Neither the name of the copyright holders
13 * nor the names of contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/* $Id: iso_week_date_r.c 2394 2013-05-04 10:26:24Z swfltek $ */
30
31/*
32 Compute the ISO 8601 week date corresponding to the given year and day of year.
33 See http://en.wikipedia.org/wiki/ISO_week_date for a full description. To summarize:
34
35 Weeks are numbered from 1 to 53.
36 Week days are numbered 1 to 7, beginning with Monday as day 1.
37
38 The first week of the year contains the first Thursday in that year.
39 Dates prior to week 1 belong to the final week of the previous year.
40
41 The final week of the year contains the last Thursday in that year.
42 Dates after the final week belong to week 1 of the following year.
43
44*/
45
46#include <time.h>
47
48void
49iso_week_date_r(int y, int yday, struct week_date * iso)
50{
51 uint16_t years, n, wday;
52 int weeknum;
53 int isLeap;
54
55 iso->year = y;
56
57 isLeap = is_leap_year(y);
58
59 /* compute days elapsed since epoch */
60 years = y - 2000;
61 n = 365 * years + yday;
62 if (years) {
63 n++; /* epoch was a leap year */
64 n += years / 4;
65 n -= isLeap;
66 if (years > 100)
67 n--;
68 }
69
70 /* compute ISO8601 day of week (1 ... 7, Monday = 1) */
71 wday = n + 6; /* epoch was a Saturday */
72 wday %= 7;
73 if (wday == 0)
74 wday = 7;
75
76 iso->day = wday;
77
78 /* compute tentative week number */
79 weeknum = yday + 11 - wday;
80 weeknum /= 7;
81
82 /* if 53, it could be week 1 of the following year */
83 if (weeknum == 53) {
84 /*
85 The final week must include its Thursday in the year. We determine the yday of this
86 weeks Thursday, and test whether it exceeds this years length.
87 */
88
89 /* determine final yday of this year, 364 or 365 */
90 n = 364 + isLeap;
91
92 /* compute yday of this weeks Thursday */
93 wday--; /* convert to zero based week, Monday = 0 */
94 yday -= wday; /* yday of this weeks Monday */
95 yday += 3; /* yday of this weeks Thursday */
96
97 /* Is this weeks Thursday included in the year? */
98 if (yday > (int) n) {
99 iso->year++;
100 weeknum = 1;
101 }
102 }
103 iso->week = weeknum;
104
105 /*
106 If zero, it is the final week of the previous year.
107 We determine that by asking for the week number of Dec 31.
108 */
109 if (weeknum == 0) {
110 y = y - 1;
111 iso_week_date_r(y, 364 + is_leap_year(y), iso);
112 iso->day = wday;
113 }
114}