1use crate::{ffi, translate::*, BoolError, TimeSpan, TimeZone};
6
7crate::wrapper! {
8 #[derive(Debug)]
9 pub struct DateTime(Shared<ffi::GDateTime>);
10
11 match fn {
12 ref => |ptr| ffi::g_date_time_ref(ptr),
13 unref => |ptr| ffi::g_date_time_unref(ptr),
14 type_ => || ffi::g_date_time_get_type(),
15 }
16}
17
18impl DateTime {
19 #[doc(alias = "g_date_time_new")]
20 pub fn new(
21 tz: &TimeZone,
22 year: i32,
23 month: i32,
24 day: i32,
25 hour: i32,
26 minute: i32,
27 seconds: f64,
28 ) -> Result<DateTime, BoolError> {
29 unsafe {
30 Option::<_>::from_glib_full(ffi::g_date_time_new(
31 tz.to_glib_none().0,
32 year,
33 month,
34 day,
35 hour,
36 minute,
37 seconds,
38 ))
39 .ok_or_else(|| crate::bool_error!("Invalid date"))
40 }
41 }
42
43 #[doc(alias = "g_date_time_new_from_iso8601")]
44 #[doc(alias = "new_from_iso8601")]
45 pub fn from_iso8601(text: &str, default_tz: Option<&TimeZone>) -> Result<DateTime, BoolError> {
46 unsafe {
47 Option::<_>::from_glib_full(ffi::g_date_time_new_from_iso8601(
48 text.to_glib_none().0,
49 default_tz.to_glib_none().0,
50 ))
51 .ok_or_else(|| crate::bool_error!("Invalid date"))
52 }
53 }
54
55 #[doc(alias = "g_date_time_new_from_unix_local")]
72 #[doc(alias = "new_from_unix_local")]
73 pub fn from_unix_local(t: i64) -> Result<DateTime, BoolError> {
74 unsafe {
75 Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_local(t))
76 .ok_or_else(|| crate::bool_error!("Invalid date"))
77 }
78 }
79
80 #[cfg(feature = "v2_80")]
81 #[cfg_attr(docsrs, doc(cfg(feature = "v2_80")))]
82 #[doc(alias = "g_date_time_new_from_unix_local_usec")]
83 #[doc(alias = "new_from_unix_local_usec")]
84 pub fn from_unix_local_usec(usecs: i64) -> Result<DateTime, BoolError> {
85 unsafe {
86 Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_local_usec(usecs))
87 .ok_or_else(|| crate::bool_error!("Invalid date"))
88 }
89 }
90
91 #[doc(alias = "g_date_time_new_from_unix_utc")]
92 #[doc(alias = "new_from_unix_utc")]
93 pub fn from_unix_utc(t: i64) -> Result<DateTime, BoolError> {
94 unsafe {
95 Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_utc(t))
96 .ok_or_else(|| crate::bool_error!("Invalid date"))
97 }
98 }
99
100 #[cfg(feature = "v2_80")]
101 #[cfg_attr(docsrs, doc(cfg(feature = "v2_80")))]
102 #[doc(alias = "g_date_time_new_from_unix_utc_usec")]
103 #[doc(alias = "new_from_unix_utc_usec")]
104 pub fn from_unix_utc_usec(usecs: i64) -> Result<DateTime, BoolError> {
105 unsafe {
106 Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_utc_usec(usecs))
107 .ok_or_else(|| crate::bool_error!("Invalid date"))
108 }
109 }
110
111 #[doc(alias = "g_date_time_new_local")]
112 #[doc(alias = "new_local")]
113 pub fn from_local(
114 year: i32,
115 month: i32,
116 day: i32,
117 hour: i32,
118 minute: i32,
119 seconds: f64,
120 ) -> Result<DateTime, BoolError> {
121 unsafe {
122 Option::<_>::from_glib_full(ffi::g_date_time_new_local(
123 year, month, day, hour, minute, seconds,
124 ))
125 .ok_or_else(|| crate::bool_error!("Invalid date"))
126 }
127 }
128
129 #[doc(alias = "g_date_time_new_now")]
130 #[doc(alias = "new_now")]
131 pub fn now(tz: &TimeZone) -> Result<DateTime, BoolError> {
132 unsafe {
133 Option::<_>::from_glib_full(ffi::g_date_time_new_now(tz.to_glib_none().0))
134 .ok_or_else(|| crate::bool_error!("Invalid date"))
135 }
136 }
137
138 #[doc(alias = "g_date_time_new_now_local")]
139 #[doc(alias = "new_now_local")]
140 pub fn now_local() -> Result<DateTime, BoolError> {
141 unsafe {
142 Option::<_>::from_glib_full(ffi::g_date_time_new_now_local())
143 .ok_or_else(|| crate::bool_error!("Invalid date"))
144 }
145 }
146
147 #[doc(alias = "g_date_time_new_now_utc")]
148 #[doc(alias = "new_now_utc")]
149 pub fn now_utc() -> Result<DateTime, BoolError> {
150 unsafe {
151 Option::<_>::from_glib_full(ffi::g_date_time_new_now_utc())
152 .ok_or_else(|| crate::bool_error!("Invalid date"))
153 }
154 }
155
156 #[doc(alias = "g_date_time_new_utc")]
157 #[doc(alias = "new_utc")]
158 pub fn from_utc(
159 year: i32,
160 month: i32,
161 day: i32,
162 hour: i32,
163 minute: i32,
164 seconds: f64,
165 ) -> Result<DateTime, BoolError> {
166 unsafe {
167 Option::<_>::from_glib_full(ffi::g_date_time_new_utc(
168 year, month, day, hour, minute, seconds,
169 ))
170 .ok_or_else(|| crate::bool_error!("Invalid date"))
171 }
172 }
173
174 #[doc(alias = "g_date_time_add")]
175 pub fn add(&self, timespan: TimeSpan) -> Result<DateTime, BoolError> {
176 unsafe {
177 Option::<_>::from_glib_full(ffi::g_date_time_add(
178 self.to_glib_none().0,
179 timespan.into_glib(),
180 ))
181 .ok_or_else(|| crate::bool_error!("Invalid date"))
182 }
183 }
184
185 #[doc(alias = "g_date_time_add_days")]
186 pub fn add_days(&self, days: i32) -> Result<DateTime, BoolError> {
187 unsafe {
188 Option::<_>::from_glib_full(ffi::g_date_time_add_days(self.to_glib_none().0, days))
189 .ok_or_else(|| crate::bool_error!("Invalid date"))
190 }
191 }
192
193 #[doc(alias = "g_date_time_add_full")]
194 pub fn add_full(
195 &self,
196 years: i32,
197 months: i32,
198 days: i32,
199 hours: i32,
200 minutes: i32,
201 seconds: f64,
202 ) -> Result<DateTime, BoolError> {
203 unsafe {
204 Option::<_>::from_glib_full(ffi::g_date_time_add_full(
205 self.to_glib_none().0,
206 years,
207 months,
208 days,
209 hours,
210 minutes,
211 seconds,
212 ))
213 .ok_or_else(|| crate::bool_error!("Invalid date"))
214 }
215 }
216
217 #[doc(alias = "g_date_time_add_hours")]
218 pub fn add_hours(&self, hours: i32) -> Result<DateTime, BoolError> {
219 unsafe {
220 Option::<_>::from_glib_full(ffi::g_date_time_add_hours(self.to_glib_none().0, hours))
221 .ok_or_else(|| crate::bool_error!("Invalid date"))
222 }
223 }
224
225 #[doc(alias = "g_date_time_add_minutes")]
226 pub fn add_minutes(&self, minutes: i32) -> Result<DateTime, BoolError> {
227 unsafe {
228 Option::<_>::from_glib_full(ffi::g_date_time_add_minutes(
229 self.to_glib_none().0,
230 minutes,
231 ))
232 .ok_or_else(|| crate::bool_error!("Invalid date"))
233 }
234 }
235
236 #[doc(alias = "g_date_time_add_months")]
237 pub fn add_months(&self, months: i32) -> Result<DateTime, BoolError> {
238 unsafe {
239 Option::<_>::from_glib_full(ffi::g_date_time_add_months(self.to_glib_none().0, months))
240 .ok_or_else(|| crate::bool_error!("Invalid date"))
241 }
242 }
243
244 #[doc(alias = "g_date_time_add_seconds")]
245 pub fn add_seconds(&self, seconds: f64) -> Result<DateTime, BoolError> {
246 unsafe {
247 Option::<_>::from_glib_full(ffi::g_date_time_add_seconds(
248 self.to_glib_none().0,
249 seconds,
250 ))
251 .ok_or_else(|| crate::bool_error!("Invalid date"))
252 }
253 }
254
255 #[doc(alias = "g_date_time_add_weeks")]
256 pub fn add_weeks(&self, weeks: i32) -> Result<DateTime, BoolError> {
257 unsafe {
258 Option::<_>::from_glib_full(ffi::g_date_time_add_weeks(self.to_glib_none().0, weeks))
259 .ok_or_else(|| crate::bool_error!("Invalid date"))
260 }
261 }
262
263 #[doc(alias = "g_date_time_add_years")]
264 pub fn add_years(&self, years: i32) -> Result<DateTime, BoolError> {
265 unsafe {
266 Option::<_>::from_glib_full(ffi::g_date_time_add_years(self.to_glib_none().0, years))
267 .ok_or_else(|| crate::bool_error!("Invalid date"))
268 }
269 }
270
271 #[doc(alias = "g_date_time_compare")]
272 fn compare(&self, dt2: &DateTime) -> i32 {
273 unsafe {
274 ffi::g_date_time_compare(
275 ToGlibPtr::<*mut ffi::GDateTime>::to_glib_none(self).0 as ffi::gconstpointer,
276 ToGlibPtr::<*mut ffi::GDateTime>::to_glib_none(dt2).0 as ffi::gconstpointer,
277 )
278 }
279 }
280
281 #[doc(alias = "g_date_time_difference")]
282 pub fn difference(&self, begin: &DateTime) -> TimeSpan {
283 unsafe {
284 from_glib(ffi::g_date_time_difference(
285 self.to_glib_none().0,
286 begin.to_glib_none().0,
287 ))
288 }
289 }
290
291 #[doc(alias = "g_date_time_equal")]
292 fn equal(&self, dt2: &DateTime) -> bool {
293 unsafe {
294 from_glib(ffi::g_date_time_equal(
295 ToGlibPtr::<*mut ffi::GDateTime>::to_glib_none(self).0 as ffi::gconstpointer,
296 ToGlibPtr::<*mut ffi::GDateTime>::to_glib_none(dt2).0 as ffi::gconstpointer,
297 ))
298 }
299 }
300
301 #[doc(alias = "g_date_time_format")]
302 pub fn format(&self, format: &str) -> Result<crate::GString, BoolError> {
303 unsafe {
304 Option::<_>::from_glib_full(ffi::g_date_time_format(
305 self.to_glib_none().0,
306 format.to_glib_none().0,
307 ))
308 .ok_or_else(|| crate::bool_error!("Invalid date"))
309 }
310 }
311
312 #[cfg(feature = "v2_62")]
313 #[cfg_attr(docsrs, doc(cfg(feature = "v2_62")))]
314 #[doc(alias = "g_date_time_format_iso8601")]
315 pub fn format_iso8601(&self) -> Result<crate::GString, BoolError> {
316 unsafe {
317 Option::<_>::from_glib_full(ffi::g_date_time_format_iso8601(self.to_glib_none().0))
318 .ok_or_else(|| crate::bool_error!("Invalid date"))
319 }
320 }
321
322 #[doc(alias = "g_date_time_get_day_of_month")]
323 #[doc(alias = "get_day_of_month")]
324 pub fn day_of_month(&self) -> i32 {
325 unsafe { ffi::g_date_time_get_day_of_month(self.to_glib_none().0) }
326 }
327
328 #[doc(alias = "g_date_time_get_day_of_week")]
329 #[doc(alias = "get_day_of_week")]
330 pub fn day_of_week(&self) -> i32 {
331 unsafe { ffi::g_date_time_get_day_of_week(self.to_glib_none().0) }
332 }
333
334 #[doc(alias = "g_date_time_get_day_of_year")]
335 #[doc(alias = "get_day_of_year")]
336 pub fn day_of_year(&self) -> i32 {
337 unsafe { ffi::g_date_time_get_day_of_year(self.to_glib_none().0) }
338 }
339
340 #[doc(alias = "g_date_time_get_hour")]
341 #[doc(alias = "get_hour")]
342 pub fn hour(&self) -> i32 {
343 unsafe { ffi::g_date_time_get_hour(self.to_glib_none().0) }
344 }
345
346 #[doc(alias = "g_date_time_get_microsecond")]
347 #[doc(alias = "get_microsecond")]
348 pub fn microsecond(&self) -> i32 {
349 unsafe { ffi::g_date_time_get_microsecond(self.to_glib_none().0) }
350 }
351
352 #[doc(alias = "g_date_time_get_minute")]
353 #[doc(alias = "get_minute")]
354 pub fn minute(&self) -> i32 {
355 unsafe { ffi::g_date_time_get_minute(self.to_glib_none().0) }
356 }
357
358 #[doc(alias = "g_date_time_get_month")]
359 #[doc(alias = "get_month")]
360 pub fn month(&self) -> i32 {
361 unsafe { ffi::g_date_time_get_month(self.to_glib_none().0) }
362 }
363
364 #[doc(alias = "g_date_time_get_second")]
365 #[doc(alias = "get_second")]
366 pub fn second(&self) -> i32 {
367 unsafe { ffi::g_date_time_get_second(self.to_glib_none().0) }
368 }
369
370 #[doc(alias = "g_date_time_get_seconds")]
371 #[doc(alias = "get_seconds")]
372 pub fn seconds(&self) -> f64 {
373 unsafe { ffi::g_date_time_get_seconds(self.to_glib_none().0) }
374 }
375
376 #[cfg(feature = "v2_58")]
377 #[cfg_attr(docsrs, doc(cfg(feature = "v2_58")))]
378 #[doc(alias = "g_date_time_get_timezone")]
379 #[doc(alias = "get_timezone")]
380 pub fn timezone(&self) -> TimeZone {
381 unsafe { from_glib_none(ffi::g_date_time_get_timezone(self.to_glib_none().0)) }
382 }
383
384 #[doc(alias = "g_date_time_get_timezone_abbreviation")]
385 #[doc(alias = "get_timezone_abbreviation")]
386 pub fn timezone_abbreviation(&self) -> crate::GString {
387 unsafe {
388 from_glib_none(ffi::g_date_time_get_timezone_abbreviation(
389 self.to_glib_none().0,
390 ))
391 }
392 }
393
394 #[doc(alias = "g_date_time_get_utc_offset")]
395 #[doc(alias = "get_utc_offset")]
396 pub fn utc_offset(&self) -> TimeSpan {
397 unsafe { from_glib(ffi::g_date_time_get_utc_offset(self.to_glib_none().0)) }
398 }
399
400 #[doc(alias = "g_date_time_get_week_numbering_year")]
401 #[doc(alias = "get_week_numbering_year")]
402 pub fn week_numbering_year(&self) -> i32 {
403 unsafe { ffi::g_date_time_get_week_numbering_year(self.to_glib_none().0) }
404 }
405
406 #[doc(alias = "g_date_time_get_week_of_year")]
407 #[doc(alias = "get_week_of_year")]
408 pub fn week_of_year(&self) -> i32 {
409 unsafe { ffi::g_date_time_get_week_of_year(self.to_glib_none().0) }
410 }
411
412 #[doc(alias = "g_date_time_get_year")]
413 #[doc(alias = "get_year")]
414 pub fn year(&self) -> i32 {
415 unsafe { ffi::g_date_time_get_year(self.to_glib_none().0) }
416 }
417
418 #[doc(alias = "g_date_time_get_ymd")]
419 #[doc(alias = "get_ymd")]
420 pub fn ymd(&self) -> (i32, i32, i32) {
421 unsafe {
422 let mut year = std::mem::MaybeUninit::uninit();
423 let mut month = std::mem::MaybeUninit::uninit();
424 let mut day = std::mem::MaybeUninit::uninit();
425 ffi::g_date_time_get_ymd(
426 self.to_glib_none().0,
427 year.as_mut_ptr(),
428 month.as_mut_ptr(),
429 day.as_mut_ptr(),
430 );
431 (year.assume_init(), month.assume_init(), day.assume_init())
432 }
433 }
434
435 #[doc(alias = "g_date_time_hash")]
436 fn hash(&self) -> u32 {
437 unsafe {
438 ffi::g_date_time_hash(
439 ToGlibPtr::<*mut ffi::GDateTime>::to_glib_none(self).0 as ffi::gconstpointer,
440 )
441 }
442 }
443
444 #[doc(alias = "g_date_time_is_daylight_savings")]
445 pub fn is_daylight_savings(&self) -> bool {
446 unsafe { from_glib(ffi::g_date_time_is_daylight_savings(self.to_glib_none().0)) }
447 }
448
449 #[doc(alias = "g_date_time_to_local")]
450 pub fn to_local(&self) -> Result<DateTime, BoolError> {
451 unsafe {
452 Option::<_>::from_glib_full(ffi::g_date_time_to_local(self.to_glib_none().0))
453 .ok_or_else(|| crate::bool_error!("Invalid date"))
454 }
455 }
456
457 #[doc(alias = "g_date_time_to_timezone")]
465 pub fn to_timezone(&self, tz: &TimeZone) -> Result<DateTime, BoolError> {
466 unsafe {
467 Option::<_>::from_glib_full(ffi::g_date_time_to_timezone(
468 self.to_glib_none().0,
469 tz.to_glib_none().0,
470 ))
471 .ok_or_else(|| crate::bool_error!("Invalid date"))
472 }
473 }
474
475 #[doc(alias = "g_date_time_to_unix")]
476 pub fn to_unix(&self) -> i64 {
477 unsafe { ffi::g_date_time_to_unix(self.to_glib_none().0) }
478 }
479
480 #[cfg(feature = "v2_80")]
481 #[cfg_attr(docsrs, doc(cfg(feature = "v2_80")))]
482 #[doc(alias = "g_date_time_to_unix_usec")]
483 pub fn to_unix_usec(&self) -> i64 {
484 unsafe { ffi::g_date_time_to_unix_usec(self.to_glib_none().0) }
485 }
486
487 #[doc(alias = "g_date_time_to_utc")]
488 pub fn to_utc(&self) -> Result<DateTime, BoolError> {
489 unsafe {
490 Option::<_>::from_glib_full(ffi::g_date_time_to_utc(self.to_glib_none().0))
491 .ok_or_else(|| crate::bool_error!("Invalid date"))
492 }
493 }
494}
495
496impl PartialOrd for DateTime {
497 #[inline]
498 fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
499 Some(self.cmp(other))
500 }
501}
502
503impl Ord for DateTime {
504 #[inline]
505 fn cmp(&self, other: &Self) -> std::cmp::Ordering {
506 self.compare(other).cmp(&0)
507 }
508}
509
510impl PartialEq for DateTime {
511 #[inline]
512 fn eq(&self, other: &Self) -> bool {
513 self.equal(other)
514 }
515}
516
517impl Eq for DateTime {}
518
519impl std::hash::Hash for DateTime {
520 #[inline]
521 fn hash<H>(&self, state: &mut H)
522 where
523 H: std::hash::Hasher,
524 {
525 std::hash::Hash::hash(&self.hash(), state)
526 }
527}
528
529unsafe impl Send for DateTime {}
530unsafe impl Sync for DateTime {}