ObjFW  Check-in [b97bb55c50]

Overview
Comment:Add methods to access parts of a date, in GMT/UTC.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: b97bb55c5006828a1d9fad901f9b0642ecdd4647cd6d4762e7e01de3c3f6d4c9
User & Date: js on 2010-12-27 22:36:17
Other Links: manifest | tags
Context
2010-12-28
21:21
Add -[stringWithFormat:] to OFDate. check-in: f9d3f89aff user: js tags: trunk
2010-12-27
22:36
Add methods to access parts of a date, in GMT/UTC. check-in: b97bb55c50 user: js tags: trunk
01:29
Update PLATFORMS. check-in: d3c3a28b6b user: js tags: trunk
Changes

Modified src/OFDate.h from [c40f1e470a] to [6d9504057e].

62
63
64
65
66
67
68













































69
 *
 * \param sec The seconds since 1970-01-01 00:00:00
 * \param usec The microsecond part of the time
 * \return An initialized OFDate with the specified date and time
 */
- initWithTimeIntervalSince1970: (time_t)sec
		   microseconds: (suseconds_t)usec;













































@end







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 *
 * \param sec The seconds since 1970-01-01 00:00:00
 * \param usec The microsecond part of the time
 * \return An initialized OFDate with the specified date and time
 */
- initWithTimeIntervalSince1970: (time_t)sec
		   microseconds: (suseconds_t)usec;

/**
 * \return The seconds of the date
 */
- (int)seconds;

/**
 * \return The microseconds of the date
 */
- (suseconds_t)microseconds;

/**
 * \return The minutes of the date
 */
- (int)minutes;

/**
 * \return The hours of the date
 */
- (int)hours;

/**
 * \return The day of the month of the date
 */
- (int)dayOfMonth;

/**
 * \return The month of the year of the date
 */
- (int)monthOfYear;

/**
 * \return The year of the date
 */
- (int)year;

/**
 * \return The day of the week of the date
 */
- (int)dayOfWeek;

/**
 * \return The day of the year of the date
 */
- (int)dayOfYear;
@end

Modified src/OFDate.m from [6db7ed3798] to [52c00039c4].

20
21
22
23
24
25
26


































27
28
29
30
31
32
33
#import "OFExceptions.h"

#if !defined(HAVE_GMTIME_R) && defined(OF_THREADS)
# import "OFThread.h"

static OFMutex *mutex;
#endif



































@implementation OFDate
#if !defined(HAVE_GMTIME_R) && defined(OF_THREADS)
+ (void)initialize
{
	if (self == [OFDate class])
		mutex = [[OFMutex alloc] init];







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#import "OFExceptions.h"

#if !defined(HAVE_GMTIME_R) && defined(OF_THREADS)
# import "OFThread.h"

static OFMutex *mutex;
#endif

#ifdef HAVE_GMTIME_R
# define GMTIME_RET(field)						  \
	struct tm tm;							  \
									  \
	if (gmtime_r(&sec, &tm) == NULL)				  \
		@throw [OFOutOfRangeException newWithClass: isa];	  \
									  \
	return tm.field;
#else
# ifdef OF_THREADS
#  define GMTIME_RET(field)						  \
	struct tm *tm;							  \
									  \
	[mutex lock];							  \
									  \
	@try {								  \
		if ((tm = gmtime(&sec)) == NULL)			  \
			@throw [OFOutOfRangeException newWithClass: isa]; \
									  \
		return tm->field;					  \
	} @finally {							  \
		[mutex unlock];						  \
	}
# else
#  define GMTIME_RET(field)						  \
	struct tm *tm;							  \
									  \
	if ((tm = gmtime(&sec)) == NULL)				  \
		@throw [OFOutOfRangeException newWithClass: isa];	  \
									  \
	return tm->field;
# endif
#endif

@implementation OFDate
#if !defined(HAVE_GMTIME_R) && defined(OF_THREADS)
+ (void)initialize
{
	if (self == [OFDate class])
		mutex = [[OFMutex alloc] init];
147
148
149
150
151
152
153













































154
#endif

	if (usec == 0)
		return [OFString stringWithFormat: @"%sZ", str];

	return [OFString stringWithFormat: @"%s.%06dZ", str, usec];
}













































@end







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>

181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#endif

	if (usec == 0)
		return [OFString stringWithFormat: @"%sZ", str];

	return [OFString stringWithFormat: @"%s.%06dZ", str, usec];
}

- (int)seconds
{
	GMTIME_RET(tm_sec)
}

- (suseconds_t)microseconds
{
	return usec;
}

- (int)minutes
{
	GMTIME_RET(tm_min)
}

- (int)hours
{
	GMTIME_RET(tm_hour)
}

- (int)dayOfMonth
{
	GMTIME_RET(tm_mday)
}

- (int)monthOfYear
{
	GMTIME_RET(tm_mon + 1)
}

- (int)year
{
	GMTIME_RET(tm_year + 1900)
}

- (int)dayOfWeek
{
	GMTIME_RET(tm_wday)
}

- (int)dayOfYear
{
	GMTIME_RET(tm_yday + 1)
}
@end

Modified tests/OFDateTests.m from [9d404af2db] to [6d4dee43e8].

39
40
41
42
43
44
45



















46
47
48
	TEST(@"-[isEqual:]",
	    [d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0]] &&
	    ![d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0
						   microseconds: 1]])

	TEST(@"-[compare:]", [d1 compare: d2] == OF_ORDERED_ASCENDING)




















	[pool drain];
}
@end







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
	TEST(@"-[isEqual:]",
	    [d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0]] &&
	    ![d1 isEqual: [OFDate dateWithTimeIntervalSince1970: 0
						   microseconds: 1]])

	TEST(@"-[compare:]", [d1 compare: d2] == OF_ORDERED_ASCENDING)

	TEST(@"-[seconds]", [d1 seconds] == 0 && [d2 seconds] == 5)

	TEST(@"-[microseconds]",
	    [d1 microseconds] == 0 && [d2 microseconds] == 1)

	TEST(@"-[minutes]", [d1 minutes] == 0 && [d2 minutes] == 0)

	TEST(@"-[hours]", [d1 hours] == 0 && [d2 hours] == 1)

	TEST(@"-[dayOfMonth]", [d1 dayOfMonth] == 1 && [d2 dayOfMonth] == 2)

	TEST(@"-[monthOfYear]", [d1 monthOfYear] == 1 && [d2 monthOfYear] == 1)

	TEST(@"-[year]", [d1 year] == 1970 && [d2 year] == 1970)

	TEST(@"-[dayOfWeek]", [d1 dayOfWeek] == 4 && [d2 dayOfWeek] == 5)

	TEST(@"-[dayOfYear]", [d1 dayOfYear] == 1 && [d2 dayOfYear] == 2)

	[pool drain];
}
@end