1 /* 2 * This file is part of gtkD. 3 * 4 * gtkD is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU Lesser General Public License 6 * as published by the Free Software Foundation; either version 3 7 * of the License, or (at your option) any later version, with 8 * some exceptions, please read the COPYING file. 9 * 10 * gtkD is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public License 16 * along with gtkD; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA 18 */ 19 20 // generated automatically - do not change 21 // find conversion definition on APILookup.txt 22 // implement new conversion functionalities on the wrap.utils pakage 23 24 25 module glib.Date; 26 27 private import glib.ConstructionException; 28 private import glib.Str; 29 private import glib.TimeVal; 30 private import gtkc.glib; 31 public import gtkc.glibtypes; 32 33 34 /** 35 * Represents a day between January 1, Year 1 and a few thousand years in 36 * the future. None of its members should be accessed directly. 37 * 38 * If the #GDate-struct is obtained from g_date_new(), it will be safe 39 * to mutate but invalid and thus not safe for calendrical computations. 40 * 41 * If it's declared on the stack, it will contain garbage so must be 42 * initialized with g_date_clear(). g_date_clear() makes the date invalid 43 * but sane. An invalid date doesn't represent a day, it's "empty." A date 44 * becomes valid after you set it to a Julian day or you set a day, month, 45 * and year. 46 */ 47 public class Date 48 { 49 /** the main Gtk struct */ 50 protected GDate* gDate; 51 protected bool ownedRef; 52 53 /** Get the main Gtk struct */ 54 public GDate* getDateStruct() 55 { 56 return gDate; 57 } 58 59 /** the main Gtk struct as a void* */ 60 protected void* getStruct() 61 { 62 return cast(void*)gDate; 63 } 64 65 /** 66 * Sets our main struct and passes it to the parent class. 67 */ 68 public this (GDate* gDate, bool ownedRef = false) 69 { 70 this.gDate = gDate; 71 this.ownedRef = ownedRef; 72 } 73 74 75 /** 76 * Allocates a #GDate and initializes 77 * it to a sane state. The new date will 78 * be cleared (as if you'd called g_date_clear()) but invalid (it won't 79 * represent an existing day). Free the return value with g_date_free(). 80 * 81 * Return: a newly-allocated #GDate 82 * 83 * Throws: ConstructionException GTK+ fails to create the object. 84 */ 85 public this() 86 { 87 auto p = g_date_new(); 88 89 if(p is null) 90 { 91 throw new ConstructionException("null returned by new"); 92 } 93 94 this(cast(GDate*) p); 95 } 96 97 /** 98 * Like g_date_new(), but also sets the value of the date. Assuming the 99 * day-month-year triplet you pass in represents an existing day, the 100 * returned date will be valid. 101 * 102 * Params: 103 * day = day of the month 104 * month = month of the year 105 * year = year 106 * 107 * Return: a newly-allocated #GDate initialized with @day, @month, and @year 108 * 109 * Throws: ConstructionException GTK+ fails to create the object. 110 */ 111 public this(GDateDay day, GDateMonth month, GDateYear year) 112 { 113 auto p = g_date_new_dmy(day, month, year); 114 115 if(p is null) 116 { 117 throw new ConstructionException("null returned by new_dmy"); 118 } 119 120 this(cast(GDate*) p); 121 } 122 123 /** 124 * Like g_date_new(), but also sets the value of the date. Assuming the 125 * Julian day number you pass in is valid (greater than 0, less than an 126 * unreasonably large number), the returned date will be valid. 127 * 128 * Params: 129 * julianDay = days since January 1, Year 1 130 * 131 * Return: a newly-allocated #GDate initialized with @julian_day 132 * 133 * Throws: ConstructionException GTK+ fails to create the object. 134 */ 135 public this(uint julianDay) 136 { 137 auto p = g_date_new_julian(julianDay); 138 139 if(p is null) 140 { 141 throw new ConstructionException("null returned by new_julian"); 142 } 143 144 this(cast(GDate*) p); 145 } 146 147 /** 148 * Increments a date some number of days. 149 * To move forward by weeks, add weeks*7 days. 150 * The date must be valid. 151 * 152 * Params: 153 * nDays = number of days to move the date forward 154 */ 155 public void addDays(uint nDays) 156 { 157 g_date_add_days(gDate, nDays); 158 } 159 160 /** 161 * Increments a date by some number of months. 162 * If the day of the month is greater than 28, 163 * this routine may change the day of the month 164 * (because the destination month may not have 165 * the current day in it). The date must be valid. 166 * 167 * Params: 168 * nMonths = number of months to move forward 169 */ 170 public void addMonths(uint nMonths) 171 { 172 g_date_add_months(gDate, nMonths); 173 } 174 175 /** 176 * Increments a date by some number of years. 177 * If the date is February 29, and the destination 178 * year is not a leap year, the date will be changed 179 * to February 28. The date must be valid. 180 * 181 * Params: 182 * nYears = number of years to move forward 183 */ 184 public void addYears(uint nYears) 185 { 186 g_date_add_years(gDate, nYears); 187 } 188 189 /** 190 * If @date is prior to @min_date, sets @date equal to @min_date. 191 * If @date falls after @max_date, sets @date equal to @max_date. 192 * Otherwise, @date is unchanged. 193 * Either of @min_date and @max_date may be %NULL. 194 * All non-%NULL dates must be valid. 195 * 196 * Params: 197 * minDate = minimum accepted value for @date 198 * maxDate = maximum accepted value for @date 199 */ 200 public void clamp(Date minDate, Date maxDate) 201 { 202 g_date_clamp(gDate, (minDate is null) ? null : minDate.getDateStruct(), (maxDate is null) ? null : maxDate.getDateStruct()); 203 } 204 205 /** 206 * Initializes one or more #GDate structs to a sane but invalid 207 * state. The cleared dates will not represent an existing date, but will 208 * not contain garbage. Useful to init a date declared on the stack. 209 * Validity can be tested with g_date_valid(). 210 * 211 * Params: 212 * nDates = number of dates to clear 213 */ 214 public void clear(uint nDates) 215 { 216 g_date_clear(gDate, nDates); 217 } 218 219 /** 220 * qsort()-style comparison function for dates. 221 * Both dates must be valid. 222 * 223 * Params: 224 * rhs = second date to compare 225 * 226 * Return: 0 for equal, less than zero if @lhs is less than @rhs, 227 * greater than zero if @lhs is greater than @rhs 228 */ 229 public int compare(Date rhs) 230 { 231 return g_date_compare(gDate, (rhs is null) ? null : rhs.getDateStruct()); 232 } 233 234 /** 235 * Computes the number of days between two dates. 236 * If @date2 is prior to @date1, the returned value is negative. 237 * Both dates must be valid. 238 * 239 * Params: 240 * date2 = the second date 241 * 242 * Return: the number of days between @date1 and @date2 243 */ 244 public int daysBetween(Date date2) 245 { 246 return g_date_days_between(gDate, (date2 is null) ? null : date2.getDateStruct()); 247 } 248 249 /** 250 * Frees a #GDate returned from g_date_new(). 251 */ 252 public void free() 253 { 254 g_date_free(gDate); 255 } 256 257 /** 258 * Returns the day of the month. The date must be valid. 259 * 260 * Return: day of the month 261 */ 262 public GDateDay getDay() 263 { 264 return g_date_get_day(gDate); 265 } 266 267 /** 268 * Returns the day of the year, where Jan 1 is the first day of the 269 * year. The date must be valid. 270 * 271 * Return: day of the year 272 */ 273 public uint getDayOfYear() 274 { 275 return g_date_get_day_of_year(gDate); 276 } 277 278 /** 279 * Returns the week of the year, where weeks are interpreted according 280 * to ISO 8601. 281 * 282 * Return: ISO 8601 week number of the year. 283 * 284 * Since: 2.6 285 */ 286 public uint getIso8601WeekOfYear() 287 { 288 return g_date_get_iso8601_week_of_year(gDate); 289 } 290 291 /** 292 * Returns the Julian day or "serial number" of the #GDate. The 293 * Julian day is simply the number of days since January 1, Year 1; i.e., 294 * January 1, Year 1 is Julian day 1; January 2, Year 1 is Julian day 2, 295 * etc. The date must be valid. 296 * 297 * Return: Julian day 298 */ 299 public uint getJulian() 300 { 301 return g_date_get_julian(gDate); 302 } 303 304 /** 305 * Returns the week of the year, where weeks are understood to start on 306 * Monday. If the date is before the first Monday of the year, return 0. 307 * The date must be valid. 308 * 309 * Return: week of the year 310 */ 311 public uint getMondayWeekOfYear() 312 { 313 return g_date_get_monday_week_of_year(gDate); 314 } 315 316 /** 317 * Returns the month of the year. The date must be valid. 318 * 319 * Return: month of the year as a #GDateMonth 320 */ 321 public GDateMonth getMonth() 322 { 323 return g_date_get_month(gDate); 324 } 325 326 /** 327 * Returns the week of the year during which this date falls, if 328 * weeks are understood to begin on Sunday. The date must be valid. 329 * Can return 0 if the day is before the first Sunday of the year. 330 * 331 * Return: week number 332 */ 333 public uint getSundayWeekOfYear() 334 { 335 return g_date_get_sunday_week_of_year(gDate); 336 } 337 338 /** 339 * Returns the day of the week for a #GDate. The date must be valid. 340 * 341 * Return: day of the week as a #GDateWeekday. 342 */ 343 public GDateWeekday getWeekday() 344 { 345 return g_date_get_weekday(gDate); 346 } 347 348 /** 349 * Returns the year of a #GDate. The date must be valid. 350 * 351 * Return: year in which the date falls 352 */ 353 public GDateYear getYear() 354 { 355 return g_date_get_year(gDate); 356 } 357 358 /** 359 * Returns %TRUE if the date is on the first of a month. 360 * The date must be valid. 361 * 362 * Return: %TRUE if the date is the first of the month 363 */ 364 public bool isFirstOfMonth() 365 { 366 return g_date_is_first_of_month(gDate) != 0; 367 } 368 369 /** 370 * Returns %TRUE if the date is the last day of the month. 371 * The date must be valid. 372 * 373 * Return: %TRUE if the date is the last day of the month 374 */ 375 public bool isLastOfMonth() 376 { 377 return g_date_is_last_of_month(gDate) != 0; 378 } 379 380 /** 381 * Checks if @date1 is less than or equal to @date2, 382 * and swap the values if this is not the case. 383 * 384 * Params: 385 * date2 = the second date 386 */ 387 public void order(Date date2) 388 { 389 g_date_order(gDate, (date2 is null) ? null : date2.getDateStruct()); 390 } 391 392 /** 393 * Sets the day of the month for a #GDate. If the resulting 394 * day-month-year triplet is invalid, the date will be invalid. 395 * 396 * Params: 397 * day = day to set 398 */ 399 public void setDay(GDateDay day) 400 { 401 g_date_set_day(gDate, day); 402 } 403 404 /** 405 * Sets the value of a #GDate from a day, month, and year. 406 * The day-month-year triplet must be valid; if you aren't 407 * sure it is, call g_date_valid_dmy() to check before you 408 * set it. 409 * 410 * Params: 411 * day = day 412 * month = month 413 * y = year 414 */ 415 public void setDmy(GDateDay day, GDateMonth month, GDateYear y) 416 { 417 g_date_set_dmy(gDate, day, month, y); 418 } 419 420 /** 421 * Sets the value of a #GDate from a Julian day number. 422 * 423 * Params: 424 * julianDate = Julian day number (days since January 1, Year 1) 425 */ 426 public void setJulian(uint julianDate) 427 { 428 g_date_set_julian(gDate, julianDate); 429 } 430 431 /** 432 * Sets the month of the year for a #GDate. If the resulting 433 * day-month-year triplet is invalid, the date will be invalid. 434 * 435 * Params: 436 * month = month to set 437 */ 438 public void setMonth(GDateMonth month) 439 { 440 g_date_set_month(gDate, month); 441 } 442 443 /** 444 * Parses a user-inputted string @str, and try to figure out what date it 445 * represents, taking the [current locale][setlocale] into account. If the 446 * string is successfully parsed, the date will be valid after the call. 447 * Otherwise, it will be invalid. You should check using g_date_valid() 448 * to see whether the parsing succeeded. 449 * 450 * This function is not appropriate for file formats and the like; it 451 * isn't very precise, and its exact behavior varies with the locale. 452 * It's intended to be a heuristic routine that guesses what the user 453 * means by a given string (and it does work pretty well in that 454 * capacity). 455 * 456 * Params: 457 * str = string to parse 458 */ 459 public void setParse(string str) 460 { 461 g_date_set_parse(gDate, Str.toStringz(str)); 462 } 463 464 /** 465 * Sets the value of a date from a #GTime value. 466 * The time to date conversion is done using the user's current timezone. 467 * 468 * Deprecated: Use g_date_set_time_t() instead. 469 * 470 * Params: 471 * time = #GTime value to set. 472 */ 473 public void setTime(GTime time) 474 { 475 g_date_set_time(gDate, time); 476 } 477 478 /** 479 * Sets the value of a date to the date corresponding to a time 480 * specified as a time_t. The time to date conversion is done using 481 * the user's current timezone. 482 * 483 * To set the value of a date to the current day, you could write: 484 * |[<!-- language="C" --> 485 * g_date_set_time_t (date, time (NULL)); 486 * ]| 487 * 488 * Params: 489 * timet = time_t value to set 490 * 491 * Since: 2.10 492 */ 493 public void setTimeT(uint timet) 494 { 495 g_date_set_time_t(gDate, timet); 496 } 497 498 /** 499 * Sets the value of a date from a #GTimeVal value. Note that the 500 * @tv_usec member is ignored, because #GDate can't make use of the 501 * additional precision. 502 * 503 * The time to date conversion is done using the user's current timezone. 504 * 505 * Params: 506 * timeval = #GTimeVal value to set 507 * 508 * Since: 2.10 509 */ 510 public void setTimeVal(TimeVal timeval) 511 { 512 g_date_set_time_val(gDate, (timeval is null) ? null : timeval.getTimeValStruct()); 513 } 514 515 /** 516 * Sets the year for a #GDate. If the resulting day-month-year 517 * triplet is invalid, the date will be invalid. 518 * 519 * Params: 520 * year = year to set 521 */ 522 public void setYear(GDateYear year) 523 { 524 g_date_set_year(gDate, year); 525 } 526 527 /** 528 * Moves a date some number of days into the past. 529 * To move by weeks, just move by weeks*7 days. 530 * The date must be valid. 531 * 532 * Params: 533 * nDays = number of days to move 534 */ 535 public void subtractDays(uint nDays) 536 { 537 g_date_subtract_days(gDate, nDays); 538 } 539 540 /** 541 * Moves a date some number of months into the past. 542 * If the current day of the month doesn't exist in 543 * the destination month, the day of the month 544 * may change. The date must be valid. 545 * 546 * Params: 547 * nMonths = number of months to move 548 */ 549 public void subtractMonths(uint nMonths) 550 { 551 g_date_subtract_months(gDate, nMonths); 552 } 553 554 /** 555 * Moves a date some number of years into the past. 556 * If the current day doesn't exist in the destination 557 * year (i.e. it's February 29 and you move to a non-leap-year) 558 * then the day is changed to February 29. The date 559 * must be valid. 560 * 561 * Params: 562 * nYears = number of years to move 563 */ 564 public void subtractYears(uint nYears) 565 { 566 g_date_subtract_years(gDate, nYears); 567 } 568 569 /** 570 * Fills in the date-related bits of a struct tm using the @date value. 571 * Initializes the non-date parts with something sane but meaningless. 572 * 573 * Params: 574 * tm = struct tm to fill 575 */ 576 public void toStructTm(void* tm) 577 { 578 g_date_to_struct_tm(gDate, tm); 579 } 580 581 /** 582 * Returns %TRUE if the #GDate represents an existing day. The date must not 583 * contain garbage; it should have been initialized with g_date_clear() 584 * if it wasn't allocated by one of the g_date_new() variants. 585 * 586 * Return: Whether the date is valid 587 */ 588 public bool valid() 589 { 590 return g_date_valid(gDate) != 0; 591 } 592 593 /** 594 * Returns the number of days in a month, taking leap 595 * years into account. 596 * 597 * Params: 598 * month = month 599 * year = year 600 * 601 * Return: number of days in @month during the @year 602 */ 603 public static ubyte getDaysInMonth(GDateMonth month, GDateYear year) 604 { 605 return g_date_get_days_in_month(month, year); 606 } 607 608 /** 609 * Returns the number of weeks in the year, where weeks 610 * are taken to start on Monday. Will be 52 or 53. The 611 * date must be valid. (Years always have 52 7-day periods, 612 * plus 1 or 2 extra days depending on whether it's a leap 613 * year. This function is basically telling you how many 614 * Mondays are in the year, i.e. there are 53 Mondays if 615 * one of the extra days happens to be a Monday.) 616 * 617 * Params: 618 * year = a year 619 * 620 * Return: number of Mondays in the year 621 */ 622 public static ubyte getMondayWeeksInYear(GDateYear year) 623 { 624 return g_date_get_monday_weeks_in_year(year); 625 } 626 627 /** 628 * Returns the number of weeks in the year, where weeks 629 * are taken to start on Sunday. Will be 52 or 53. The 630 * date must be valid. (Years always have 52 7-day periods, 631 * plus 1 or 2 extra days depending on whether it's a leap 632 * year. This function is basically telling you how many 633 * Sundays are in the year, i.e. there are 53 Sundays if 634 * one of the extra days happens to be a Sunday.) 635 * 636 * Params: 637 * year = year to count weeks in 638 * 639 * Return: the number of weeks in @year 640 */ 641 public static ubyte getSundayWeeksInYear(GDateYear year) 642 { 643 return g_date_get_sunday_weeks_in_year(year); 644 } 645 646 /** 647 * Returns %TRUE if the year is a leap year. 648 * 649 * For the purposes of this function, leap year is every year 650 * divisible by 4 unless that year is divisible by 100. If it 651 * is divisible by 100 it would be a leap year only if that year 652 * is also divisible by 400. 653 * 654 * Params: 655 * year = year to check 656 * 657 * Return: %TRUE if the year is a leap year 658 */ 659 public static bool isLeapYear(GDateYear year) 660 { 661 return g_date_is_leap_year(year) != 0; 662 } 663 664 /** 665 * Generates a printed representation of the date, in a 666 * [locale][setlocale]-specific way. 667 * Works just like the platform's C library strftime() function, 668 * but only accepts date-related formats; time-related formats 669 * give undefined results. Date must be valid. Unlike strftime() 670 * (which uses the locale encoding), works on a UTF-8 format 671 * string and stores a UTF-8 result. 672 * 673 * This function does not provide any conversion specifiers in 674 * addition to those implemented by the platform's C library. 675 * For example, don't expect that using g_date_strftime() would 676 * make the \%F provided by the C99 strftime() work on Windows 677 * where the C library only complies to C89. 678 * 679 * Params: 680 * s = destination buffer 681 * slen = buffer size 682 * format = format string 683 * date = valid #GDate 684 * 685 * Return: number of characters written to the buffer, or 0 the buffer was too small 686 */ 687 public static size_t strftime(string s, size_t slen, string format, Date date) 688 { 689 return g_date_strftime(Str.toStringz(s), slen, Str.toStringz(format), (date is null) ? null : date.getDateStruct()); 690 } 691 692 /** 693 * Returns %TRUE if the day of the month is valid (a day is valid if it's 694 * between 1 and 31 inclusive). 695 * 696 * Params: 697 * day = day to check 698 * 699 * Return: %TRUE if the day is valid 700 */ 701 public static bool validDay(GDateDay day) 702 { 703 return g_date_valid_day(day) != 0; 704 } 705 706 /** 707 * Returns %TRUE if the day-month-year triplet forms a valid, existing day 708 * in the range of days #GDate understands (Year 1 or later, no more than 709 * a few thousand years in the future). 710 * 711 * Params: 712 * day = day 713 * month = month 714 * year = year 715 * 716 * Return: %TRUE if the date is a valid one 717 */ 718 public static bool validDmy(GDateDay day, GDateMonth month, GDateYear year) 719 { 720 return g_date_valid_dmy(day, month, year) != 0; 721 } 722 723 /** 724 * Returns %TRUE if the Julian day is valid. Anything greater than zero 725 * is basically a valid Julian, though there is a 32-bit limit. 726 * 727 * Params: 728 * julianDate = Julian day to check 729 * 730 * Return: %TRUE if the Julian day is valid 731 */ 732 public static bool validJulian(uint julianDate) 733 { 734 return g_date_valid_julian(julianDate) != 0; 735 } 736 737 /** 738 * Returns %TRUE if the month value is valid. The 12 #GDateMonth 739 * enumeration values are the only valid months. 740 * 741 * Params: 742 * month = month 743 * 744 * Return: %TRUE if the month is valid 745 */ 746 public static bool validMonth(GDateMonth month) 747 { 748 return g_date_valid_month(month) != 0; 749 } 750 751 /** 752 * Returns %TRUE if the weekday is valid. The seven #GDateWeekday enumeration 753 * values are the only valid weekdays. 754 * 755 * Params: 756 * weekday = weekday 757 * 758 * Return: %TRUE if the weekday is valid 759 */ 760 public static bool validWeekday(GDateWeekday weekday) 761 { 762 return g_date_valid_weekday(weekday) != 0; 763 } 764 765 /** 766 * Returns %TRUE if the year is valid. Any year greater than 0 is valid, 767 * though there is a 16-bit limit to what #GDate will understand. 768 * 769 * Params: 770 * year = year 771 * 772 * Return: %TRUE if the year is valid 773 */ 774 public static bool validYear(GDateYear year) 775 { 776 return g_date_valid_year(year) != 0; 777 } 778 }