|
|
1.1 root 1:
2: /******************************************************************************\
3: * This is a part of the Microsoft Source Code Samples.
4: * Copyright (C) 1993 Microsoft Corporation.
5: * All rights reserved.
6: * This source code is only intended as a supplement to
7: * Microsoft Development Tools and/or WinHelp documentation.
8: * See these sources for detailed information regarding the
9: * Microsoft samples programs.
10: \******************************************************************************/
11:
12: /****************************** Module Header *******************************
13: * Module Name: GDATE.C
14: *
15: * Contains date conversion functions.
16: *
17: * Functions:
18: *
19: * gdi_isleap()
20: * gdate_daytodmy()
21: * gdate_dmytoday()
22: * gdate_monthdays()
23: * gdate_weeklyday()
24: *
25: * Comments:
26: *
27: ****************************************************************************/
28:
29: #include <windows.h>
30: #include <string.h>
31:
32: #include "gutils.h"
33:
34:
35: BOOL gdi_isleap(LONG year);
36:
37: /*---static data--------------------------------------------*/
38:
39: int monthdays[] = {
40: 31,
41: 28,
42: 31,
43: 30,
44: 31,
45: 30,
46: 31,
47: 31,
48: 30,
49: 31,
50: 30,
51: 31
52: };
53:
54:
55: /***************************************************************************
56: * Function: gdate_daytomy
57: *
58: * Purpose:
59: *
60: * converts day to d/m/y
61: */
62: void APIENTRY
63: gdate_daytodmy(LONG days, int FAR* yrp, int FAR* monthp, int FAR* dayp)
64: {
65: int years;
66: int nleaps;
67: int month;
68: int mdays;
69:
70: /* get number of completed years and calc leap days */
71: years = (int) (days / 365);
72: days = days % 365;
73: nleaps = (years / 4) - (years / 100) + (years / 400);
74: while (nleaps > days) {
75: days += 365;
76: years--;
77: nleaps = (years / 4) - (years / 100) + (years / 400);
78: }
79: days -= nleaps;
80:
81: /* add one year for current (non-complete) year */
82: years++;
83:
84:
85: /* current month */
86: for (month = 0; month < 12; month++) {
87: mdays = monthdays[month];
88: if (gdi_isleap(years) && (month == 1)) {
89: mdays++;
90: }
91: if (days == mdays) {
92: days = 0;
93: month++;
94: break;
95: } else if (days < mdays) {
96: break;
97: } else {
98: days -= mdays;
99: }
100: }
101: /* conv month from 0-11 to 1-12 */
102: if (monthp != NULL) {
103: *monthp = month+1;
104: }
105: if (dayp != NULL) {
106: *dayp = (int) days + 1;
107: }
108: if (yrp != NULL) {
109: *yrp = years;
110: }
111: }
112:
113:
114: /***************************************************************************
115: * Function: gdate_dmytoday
116: *
117: * Purpose:
118: *
119: * converts d/m/y to a day
120: */
121: LONG APIENTRY
122: gdate_dmytoday(int yr, int month, int day)
123: {
124: int nleaps;
125: int i;
126: long ndays;
127:
128: /* exclude the current year */
129: yr--;
130: nleaps = (yr / 4) - (yr / 100) + (yr / 400);
131:
132: /* in any given year, day 0 is jan1 */
133: month--;
134: day--;
135: ndays = 0;
136: for (i = 0; i < month ; i++) {
137: ndays += monthdays[i];
138: if (gdi_isleap(yr+1) && (i == 1)) {
139: ndays++;
140: }
141: }
142: ndays = ndays + day + nleaps + (yr * 365L);
143: return(ndays);
144: }
145:
146: /***************************************************************************
147: * Function: gdate_monthdays
148: *
149: * Purpose:
150: *
151: * Gets number of days in month
152: */
153: int APIENTRY
154: gdate_monthdays(int month, int year)
155: {
156: int ndays;
157:
158: ndays = monthdays[month - 1];
159: if (gdi_isleap(year) && (month == 2)) {
160: ndays++;
161: }
162: return(ndays);
163: }
164:
165: /***************************************************************************
166: * Function: gdate_weekday
167: *
168: * Purpose:
169: *
170: * Gets the day of the week
171: */
172: int APIENTRY
173: gdate_weekday(long daynr)
174: {
175: return((int) ((daynr + 1) % 7));
176: }
177:
178:
179: /***************************************************************************
180: * Function: gdi_isleap
181: *
182: * Purpose:
183: *
184: * Determines whether the year is a leap year
185: */
186: BOOL
187: gdi_isleap(LONG year)
188: {
189: if ( ((year % 4) == 0) &&
190: (((year % 100) != 0) ||
191: ((year % 400) == 0))) {
192: return TRUE;
193: } else {
194: return FALSE;
195: }
196: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.