quando/example_test.go

776 lines
23 KiB
Go
Raw Normal View History

package quando_test
import (
"errors"
"fmt"
"time"
"code.beautifulmachines.dev/jakoubek/quando"
)
func ExampleNow() {
date := quando.Now()
fmt.Printf("Current date type: %T\n", date)
// Output: Current date type: quando.Date
}
func ExampleFrom() {
t := time.Date(2026, 2, 9, 12, 30, 45, 0, time.UTC)
date := quando.From(t)
fmt.Println(date)
// Output: 2026-02-09 12:30:45
}
func ExampleFromUnix() {
// Create date from Unix timestamp
date := quando.FromUnix(1707480000)
fmt.Println(date.Time().UTC().Format("2006-01-02 15:04:05 MST"))
// Output: 2024-02-09 12:00:00 UTC
}
func ExampleFromUnix_negative() {
// Create date from negative Unix timestamp (before 1970)
date := quando.FromUnix(-946771200)
fmt.Println(date.Time().UTC().Format("2006-01-02"))
// Output: 1940-01-01
}
func ExampleDate_Time() {
date := quando.From(time.Date(2026, 2, 9, 12, 30, 45, 0, time.UTC))
t := date.Time()
fmt.Printf("%d-%02d-%02d\n", t.Year(), t.Month(), t.Day())
// Output: 2026-02-09
}
func ExampleDate_Unix() {
date := quando.From(time.Date(2024, 2, 9, 12, 0, 0, 0, time.UTC))
timestamp := date.Unix()
fmt.Println(timestamp)
// Output: 1707480000
}
func ExampleDate_WithLang() {
_ = quando.Now().WithLang(quando.DE)
fmt.Printf("Language set to: %v\n", "DE")
// Output: Language set to: DE
}
func ExampleDate_String() {
date := quando.From(time.Date(2026, 2, 9, 12, 30, 45, 0, time.UTC))
fmt.Println(date)
// Output: 2026-02-09 12:30:45
}
// ExampleDate_immutability demonstrates that Date is immutable
func ExampleDate_immutability() {
original := quando.From(time.Date(2026, 2, 9, 12, 0, 0, 0, time.UTC))
modified := original.WithLang(quando.DE)
fmt.Printf("Original: %v\n", original)
fmt.Printf("Modified: %v\n", modified)
fmt.Println("Original unchanged: true")
// Output:
// Original: 2026-02-09 12:00:00
// Modified: 2026-02-09 12:00:00
// Original unchanged: true
}
// ExampleNewClock demonstrates creating a default clock
func ExampleNewClock() {
clock := quando.NewClock()
_ = clock.Now()
fmt.Println("Clock created")
// Output: Clock created
}
// ExampleNewFixedClock demonstrates creating a fixed clock for testing
func ExampleNewFixedClock() {
// Create a fixed clock that always returns the same time
fixedTime := time.Date(2026, 2, 9, 12, 0, 0, 0, time.UTC)
clock := quando.NewFixedClock(fixedTime)
// Now() always returns the fixed time
date := clock.Now()
fmt.Println(date)
// Output: 2026-02-09 12:00:00
}
// ExampleFixedClock_deterministic demonstrates deterministic testing with FixedClock
func ExampleFixedClock_deterministic() {
// In tests, use a fixed clock for deterministic behavior
testTime := time.Date(2026, 2, 9, 12, 0, 0, 0, time.UTC)
clock := quando.NewFixedClock(testTime)
// Call multiple times - always returns same time
date1 := clock.Now()
date2 := clock.Now()
fmt.Printf("Date 1: %v\n", date1)
fmt.Printf("Date 2: %v\n", date2)
fmt.Printf("Same: %v\n", date1.Unix() == date2.Unix())
// Output:
// Date 1: 2026-02-09 12:00:00
// Date 2: 2026-02-09 12:00:00
// Same: true
}
// ExampleUnit demonstrates the Unit type
func ExampleUnit() {
// Units are used with Add, Sub, StartOf, EndOf operations
units := []quando.Unit{
quando.Seconds,
quando.Minutes,
quando.Hours,
quando.Days,
quando.Weeks,
quando.Months,
quando.Quarters,
quando.Years,
}
for _, u := range units {
fmt.Println(u.String())
}
// Output:
// seconds
// minutes
// hours
// days
// weeks
// months
// quarters
// years
}
// ExampleUnit_String demonstrates the String method
func ExampleUnit_String() {
unit := quando.Days
fmt.Printf("Unit: %s\n", unit)
// Output: Unit: days
}
// ExampleDate_StartOf demonstrates snapping to the beginning of time units
func ExampleDate_StartOf() {
date := quando.From(time.Date(2026, 2, 15, 15, 30, 45, 0, time.UTC)) // Sunday, Feb 15
fmt.Println("Original:", date)
fmt.Println("StartOf(Week):", date.StartOf(quando.Weeks)) // Monday
fmt.Println("StartOf(Month):", date.StartOf(quando.Months)) // Feb 1
fmt.Println("StartOf(Quarter):", date.StartOf(quando.Quarters)) // Jan 1 (Q1)
fmt.Println("StartOf(Year):", date.StartOf(quando.Years)) // Jan 1
// Output:
// Original: 2026-02-15 15:30:45
// StartOf(Week): 2026-02-09 00:00:00
// StartOf(Month): 2026-02-01 00:00:00
// StartOf(Quarter): 2026-01-01 00:00:00
// StartOf(Year): 2026-01-01 00:00:00
}
// ExampleDate_EndOf demonstrates snapping to the end of time units
func ExampleDate_EndOf() {
date := quando.From(time.Date(2026, 2, 9, 15, 30, 45, 0, time.UTC)) // Monday, Feb 9
fmt.Println("Original:", date)
fmt.Println("EndOf(Week):", date.EndOf(quando.Weeks)) // Sunday
fmt.Println("EndOf(Month):", date.EndOf(quando.Months)) // Feb 28
fmt.Println("EndOf(Quarter):", date.EndOf(quando.Quarters)) // Mar 31 (Q1)
fmt.Println("EndOf(Year):", date.EndOf(quando.Years)) // Dec 31
// Output:
// Original: 2026-02-09 15:30:45
// EndOf(Week): 2026-02-15 23:59:59
// EndOf(Month): 2026-02-28 23:59:59
// EndOf(Quarter): 2026-03-31 23:59:59
// EndOf(Year): 2026-12-31 23:59:59
}
// ExampleDate_StartOf_chaining demonstrates chaining snap operations
func ExampleDate_StartOf_chaining() {
// Get the first Monday of the current quarter
date := quando.Now()
firstMondayOfQuarter := date.StartOf(quando.Quarters).StartOf(quando.Weeks)
fmt.Printf("Type: %T\n", firstMondayOfQuarter)
// Output: Type: quando.Date
}
// ExampleDate_Next demonstrates finding the next occurrence of a weekday
func ExampleDate_Next() {
// On Monday, Feb 9, 2026
date := quando.From(time.Date(2026, 2, 9, 15, 30, 0, 0, time.UTC))
fmt.Println("Today:", date.Time().Weekday())
fmt.Println("Next Monday:", date.Next(time.Monday).Time().Weekday(), "-", date.Next(time.Monday))
fmt.Println("Next Friday:", date.Next(time.Friday).Time().Weekday(), "-", date.Next(time.Friday))
// Output:
// Today: Monday
// Next Monday: Monday - 2026-02-16 15:30:00
// Next Friday: Friday - 2026-02-13 15:30:00
}
// ExampleDate_Prev demonstrates finding the previous occurrence of a weekday
func ExampleDate_Prev() {
// On Monday, Feb 9, 2026
date := quando.From(time.Date(2026, 2, 9, 15, 30, 0, 0, time.UTC))
fmt.Println("Today:", date.Time().Weekday())
fmt.Println("Prev Monday:", date.Prev(time.Monday).Time().Weekday(), "-", date.Prev(time.Monday))
fmt.Println("Prev Friday:", date.Prev(time.Friday).Time().Weekday(), "-", date.Prev(time.Friday))
// Output:
// Today: Monday
// Prev Monday: Monday - 2026-02-02 15:30:00
// Prev Friday: Friday - 2026-02-06 15:30:00
}
// ExampleDate_Next_sameWeekday demonstrates the same-weekday edge case
func ExampleDate_Next_sameWeekday() {
// Next ALWAYS returns future, never today (even if same weekday)
monday := quando.From(time.Date(2026, 2, 9, 15, 30, 0, 0, time.UTC)) // Monday
nextMonday := monday.Next(time.Monday)
fmt.Printf("Days later: %d\n", int(nextMonday.Time().Sub(monday.Time()).Hours()/24))
// Output: Days later: 7
}
// ExampleDiff demonstrates calculating the duration between two dates
func ExampleDiff() {
start := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2026, 12, 31, 0, 0, 0, 0, time.UTC)
dur := quando.Diff(start, end)
fmt.Printf("Days: %d\n", dur.Days())
fmt.Printf("Months: %d\n", dur.Months())
fmt.Printf("Years: %d\n", dur.Years())
// Output:
// Days: 364
// Months: 11
// Years: 0
}
// ExampleDuration_MonthsFloat demonstrates precise month calculations
func ExampleDuration_MonthsFloat() {
start := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2026, 2, 16, 0, 0, 0, 0, time.UTC)
dur := quando.Diff(start, end)
intMonths := dur.Months()
floatMonths := dur.MonthsFloat()
fmt.Printf("Integer months: %d\n", intMonths)
fmt.Printf("Float months: %.2f\n", floatMonths)
// Output:
// Integer months: 1
// Float months: 1.54
}
// ExampleDuration_negative demonstrates negative durations
func ExampleDuration_negative() {
// When start is after end, duration is negative
start := time.Date(2027, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
dur := quando.Diff(start, end)
fmt.Printf("Months: %d\n", dur.Months())
fmt.Printf("Years: %d\n", dur.Years())
// Output:
// Months: -12
// Years: -1
}
// ExampleErrInvalidFormat demonstrates handling invalid date formats
func Example_errorHandling() {
// Note: Parse doesn't exist yet, so this is a conceptual example
// showing the error handling pattern that will be used
// Simulate an error by directly using the sentinel error
err := quando.ErrInvalidFormat
// Check for specific error type
if errors.Is(err, quando.ErrInvalidFormat) {
fmt.Println("Invalid format detected")
}
// Output: Invalid format detected
}
// Example_errorTypes demonstrates all error types
func Example_errorTypes() {
// Show all defined error types
errors := []error{
quando.ErrInvalidFormat,
quando.ErrInvalidTimezone,
quando.ErrOverflow,
}
for _, err := range errors {
fmt.Println(err.Error())
}
// Output:
// invalid date format
// invalid timezone
// date overflow
}
feat(quando-b4r): implement Add and Sub arithmetic operations - Add Add(value, unit) method for all 8 units - Add Sub(value, unit) method (wraps Add with negative value) - Implement month-end overflow logic for Months/Quarters/Years - When adding months, if target day doesn't exist, snap to last day of month - Handle all month-end combinations correctly - Leap year support (Feb 29 edge cases) - DST-safe calendar day arithmetic for Days unit - Negative value support (Add(-1) == Sub(1)) - Method chaining support (fluent API) - Immutability verified (original date never modified) - Timezone preservation across operations - Comprehensive table-driven tests for month-end edge cases - All 30/31 day month combinations tested - Leap year tests (Feb 29 -> Feb 28) - Cross-year boundary tests - Negative value tests - Method chaining tests - Performance benchmarks (all < 1µs) - 98.8% test coverage (exceeds 95% requirement) - Godoc with month-end overflow examples Benchmark results: - AddDays: ~42ns (< 1µs target) ✓ - AddMonths: ~191ns (< 1µs target) ✓ - AddYears: ~202ns (< 1µs target) ✓ - Method chaining: ~263ns for 3 ops ✓ - Zero allocations for all operations All acceptance criteria met: ✓ Add() implemented for all 8 units ✓ Sub() implemented for all 8 units ✓ Month-end overflow logic correct ✓ Leap year handling (Feb 29 edge cases) ✓ DST handling (calendar days) ✓ Negative values supported ✓ Method chaining works ✓ Unit tests with 98.8% coverage ✓ Table-driven tests for month-end edge cases ✓ Benchmarks meet <1µs target ✓ Godoc comments with month-end examples
2026-02-11 17:43:03 +01:00
// ExampleDate_Add demonstrates date arithmetic
func ExampleDate_Add() {
date := quando.From(time.Date(2026, 1, 15, 12, 0, 0, 0, time.UTC))
fmt.Println("Original:", date)
fmt.Println("+1 day:", date.Add(1, quando.Days))
fmt.Println("+1 month:", date.Add(1, quando.Months))
fmt.Println("+1 year:", date.Add(1, quando.Years))
// Output:
// Original: 2026-01-15 12:00:00
// +1 day: 2026-01-16 12:00:00
// +1 month: 2026-02-15 12:00:00
// +1 year: 2027-01-15 12:00:00
}
// ExampleDate_Add_monthEndOverflow demonstrates month-end overflow behavior
func ExampleDate_Add_monthEndOverflow() {
// When adding months, if target day doesn't exist, snap to month end
date := quando.From(time.Date(2026, 1, 31, 12, 0, 0, 0, time.UTC))
fmt.Println("Jan 31 + 1 month:", date.Add(1, quando.Months))
fmt.Println("Jan 31 + 2 months:", date.Add(2, quando.Months))
// Output:
// Jan 31 + 1 month: 2026-02-28 12:00:00
// Jan 31 + 2 months: 2026-03-31 12:00:00
}
// ExampleDate_Sub demonstrates date subtraction
func ExampleDate_Sub() {
date := quando.From(time.Date(2026, 3, 31, 12, 0, 0, 0, time.UTC))
fmt.Println("Original:", date)
fmt.Println("-1 day:", date.Sub(1, quando.Days))
fmt.Println("-1 month:", date.Sub(1, quando.Months))
// Output:
// Original: 2026-03-31 12:00:00
// -1 day: 2026-03-30 12:00:00
// -1 month: 2026-02-28 12:00:00
}
// ExampleDate_Add_chaining demonstrates method chaining
func ExampleDate_Add_chaining() {
date := quando.From(time.Date(2026, 1, 1, 12, 0, 0, 0, time.UTC))
result := date.
Add(1, quando.Months).
Add(15, quando.Days).
Sub(2, quando.Hours)
fmt.Println(result)
// Output: 2026-02-16 10:00:00
}
// ExampleParse demonstrates basic date parsing with automatic format detection
func ExampleParse() {
date, err := quando.Parse("2026-02-09")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(date)
// Output: 2026-02-09 00:00:00
}
// ExampleParse_formats demonstrates parsing various supported date formats
func ExampleParse_formats() {
formats := []string{
"2026-02-09", // ISO format (YYYY-MM-DD)
"2026/02/09", // ISO with slash (YYYY/MM/DD)
"09.02.2026", // EU format (DD.MM.YYYY)
}
for _, f := range formats {
date, err := quando.Parse(f)
if err != nil {
fmt.Printf("Error parsing %s: %v\n", f, err)
continue
}
fmt.Println(date)
}
// Output:
// 2026-02-09 00:00:00
// 2026-02-09 00:00:00
// 2026-02-09 00:00:00
}
// ExampleParse_error demonstrates error handling for ambiguous formats
func ExampleParse_error() {
// Slash format without year prefix is ambiguous
// (could be US: MM/DD/YYYY or EU: DD/MM/YYYY)
_, err := quando.Parse("01/02/2026")
if errors.Is(err, quando.ErrInvalidFormat) {
fmt.Println("Ambiguous format detected")
}
// Output: Ambiguous format detected
}
// ExampleDate_In demonstrates timezone conversion
func ExampleDate_In() {
// Create a UTC time
utc := quando.From(time.Date(2026, 6, 15, 12, 0, 0, 0, time.UTC))
// Convert to Berlin timezone (UTC+2 in summer)
berlin, err := utc.In("Europe/Berlin")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("UTC: %v\n", utc)
fmt.Printf("Berlin: %v\n", berlin)
// Output:
// UTC: 2026-06-15 12:00:00
// Berlin: 2026-06-15 14:00:00
}
// ExampleDate_In_dst demonstrates DST handling
func ExampleDate_In_dst() {
// Winter: Europe/Berlin is UTC+1 (CET)
winter := quando.From(time.Date(2026, 1, 15, 12, 0, 0, 0, time.UTC))
berlin, _ := winter.In("Europe/Berlin")
fmt.Printf("Winter: UTC 12:00 -> Berlin %02d:00\n", berlin.Time().Hour())
// Summer: Europe/Berlin is UTC+2 (CEST)
summer := quando.From(time.Date(2026, 7, 15, 12, 0, 0, 0, time.UTC))
berlin, _ = summer.In("Europe/Berlin")
fmt.Printf("Summer: UTC 12:00 -> Berlin %02d:00\n", berlin.Time().Hour())
// Output:
// Winter: UTC 12:00 -> Berlin 13:00
// Summer: UTC 12:00 -> Berlin 14:00
}
// ExampleDate_In_error demonstrates error handling
func ExampleDate_In_error() {
date := quando.Now()
_, err := date.In("Invalid/Timezone")
if errors.Is(err, quando.ErrInvalidTimezone) {
fmt.Println("Invalid timezone name")
}
// Output: Invalid timezone name
}
// ExampleLang_MonthName demonstrates localized month names
func ExampleLang_MonthName() {
fmt.Println(quando.EN.MonthName(time.February))
fmt.Println(quando.DE.MonthName(time.February))
// Output:
// February
// Februar
}
// ExampleLang_WeekdayName demonstrates localized weekday names
func ExampleLang_WeekdayName() {
fmt.Println(quando.EN.WeekdayName(time.Monday))
fmt.Println(quando.DE.WeekdayName(time.Monday))
// Output:
// Monday
// Montag
}
// ExampleLang_DurationUnit demonstrates localized duration units
func ExampleLang_DurationUnit() {
// Singular
fmt.Println(quando.EN.DurationUnit("month", false))
fmt.Println(quando.DE.DurationUnit("month", false))
// Plural
fmt.Println(quando.EN.DurationUnit("month", true))
fmt.Println(quando.DE.DurationUnit("month", true))
// Output:
// month
// Monat
// months
// Monate
}
// ExampleDuration_Human demonstrates human-readable duration formatting in English
func ExampleDuration_Human() {
start := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2026, 11, 17, 0, 0, 0, 0, time.UTC)
dur := quando.Diff(start, end)
fmt.Println(dur.Human())
// Output: 10 months, 16 days
}
// ExampleDuration_Human_german demonstrates human-readable duration formatting in German
func ExampleDuration_Human_german() {
start := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
end := time.Date(2026, 1, 3, 5, 0, 0, 0, time.UTC)
dur := quando.Diff(start, end)
fmt.Println(dur.Human(quando.DE))
// Output: 2 Tage, 5 Stunden
}
// ExampleDuration_Human_adaptive demonstrates adaptive granularity
func ExampleDuration_Human_adaptive() {
start := time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC)
// Large duration: shows years and months
end1 := time.Date(2027, 3, 15, 0, 0, 0, 0, time.UTC)
dur1 := quando.Diff(start, end1)
fmt.Println(dur1.Human())
// Medium duration: shows days and hours
end2 := time.Date(2026, 1, 3, 5, 0, 0, 0, time.UTC)
dur2 := quando.Diff(start, end2)
fmt.Println(dur2.Human())
// Small duration: shows seconds only
end3 := time.Date(2026, 1, 1, 0, 0, 45, 0, time.UTC)
dur3 := quando.Diff(start, end3)
fmt.Println(dur3.Human())
// Output:
// 1 year, 2 months
// 2 days, 5 hours
// 45 seconds
}
// ExampleParseWithLayout demonstrates parsing with explicit layout format
func ExampleParseWithLayout() {
// US format: month/day/year
dateUS, _ := quando.ParseWithLayout("01/02/2026", "01/02/2006")
fmt.Println("US format:", dateUS) // January 2, 2026
// EU format: day/month/year
dateEU, _ := quando.ParseWithLayout("01/02/2026", "02/01/2006")
fmt.Println("EU format:", dateEU) // February 1, 2026
// Output:
// US format: 2026-01-02 00:00:00
// EU format: 2026-02-01 00:00:00
}
// ExampleParseWithLayout_custom demonstrates custom date format with English month names
func ExampleParseWithLayout_custom() {
date, _ := quando.ParseWithLayout("9. February 2026", "2. January 2006")
fmt.Println(date)
// Output: 2026-02-09 00:00:00
}
// ExampleParseWithLayout_error demonstrates error handling
func ExampleParseWithLayout_error() {
_, err := quando.ParseWithLayout("99/99/2026", "02/01/2006")
if errors.Is(err, quando.ErrInvalidFormat) {
fmt.Println("Invalid date format detected")
}
// Output: Invalid date format detected
}
// ExampleParseRelative demonstrates parsing relative date expressions
func ExampleParseRelative() {
// Simple keywords (results depend on current date)
today, _ := quando.ParseRelative("today")
tomorrow, _ := quando.ParseRelative("tomorrow")
yesterday, _ := quando.ParseRelative("yesterday")
fmt.Printf("Type: %T\n", today)
fmt.Printf("Type: %T\n", tomorrow)
fmt.Printf("Type: %T\n", yesterday)
// Output:
// Type: quando.Date
// Type: quando.Date
// Type: quando.Date
}
// ExampleParseRelative_offsets demonstrates relative offset expressions
func ExampleParseRelative_offsets() {
// Note: Results depend on current date
// Using ParseRelativeWithClock for deterministic example
clock := quando.NewFixedClock(time.Date(2026, 2, 15, 0, 0, 0, 0, time.UTC))
twoDaysFromNow, _ := quando.ParseRelativeWithClock("+2 days", clock)
oneWeekAgo, _ := quando.ParseRelativeWithClock("-1 week", clock)
threeMonthsFromNow, _ := quando.ParseRelativeWithClock("+3 months", clock)
fmt.Println(twoDaysFromNow)
fmt.Println(oneWeekAgo)
fmt.Println(threeMonthsFromNow)
// Output:
// 2026-02-17 00:00:00
// 2026-02-08 00:00:00
// 2026-05-15 00:00:00
}
// ExampleParseRelative_caseInsensitive demonstrates case-insensitive parsing
func ExampleParseRelative_caseInsensitive() {
clock := quando.NewFixedClock(time.Date(2026, 2, 15, 0, 0, 0, 0, time.UTC))
// All of these work
date1, _ := quando.ParseRelativeWithClock("today", clock)
date2, _ := quando.ParseRelativeWithClock("TODAY", clock)
date3, _ := quando.ParseRelativeWithClock("Today", clock)
fmt.Println(date1.Unix() == date2.Unix())
fmt.Println(date2.Unix() == date3.Unix())
// Output:
// true
// true
}
// ExampleParseRelative_error demonstrates error handling
func ExampleParseRelative_error() {
_, err := quando.ParseRelative("next monday") // Not supported in Phase 1
if errors.Is(err, quando.ErrInvalidFormat) {
fmt.Println("Complex expressions not yet supported")
}
// Output: Complex expressions not yet supported
}
// ExampleDate_Format demonstrates basic date formatting
func ExampleDate_Format() {
date := quando.From(time.Date(2026, 2, 9, 12, 30, 45, 0, time.UTC))
fmt.Println(date.Format(quando.ISO))
fmt.Println(date.Format(quando.EU))
fmt.Println(date.Format(quando.US))
fmt.Println(date.Format(quando.Long))
// Output:
// 2026-02-09
// 09.02.2026
// 02/09/2026
// February 9, 2026
}
// ExampleDate_Format_isoFormat demonstrates ISO 8601 format
func ExampleDate_Format_isoFormat() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC))
fmt.Println(date.Format(quando.ISO))
// Output: 2026-02-09
}
// ExampleDate_Format_euFormat demonstrates European format
func ExampleDate_Format_euFormat() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC))
fmt.Println(date.Format(quando.EU))
// Output: 09.02.2026
}
// ExampleDate_Format_usFormat demonstrates US format
func ExampleDate_Format_usFormat() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC))
fmt.Println(date.Format(quando.US))
// Output: 02/09/2026
}
// ExampleDate_Format_longFormat demonstrates long format in English
func ExampleDate_Format_longFormat() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC))
fmt.Println(date.Format(quando.Long))
// Output: February 9, 2026
}
// ExampleDate_Format_longFormatGerman demonstrates long format in German
func ExampleDate_Format_longFormatGerman() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC)).WithLang(quando.DE)
fmt.Println(date.Format(quando.Long))
// Output: 9. Februar 2026
}
// ExampleDate_Format_rfc2822Format demonstrates RFC 2822 email format
func ExampleDate_Format_rfc2822Format() {
date := quando.From(time.Date(2026, 2, 9, 12, 30, 45, 0, time.UTC))
fmt.Println(date.Format(quando.RFC2822))
// Output: Mon, 09 Feb 2026 12:30:45 +0000
}
// ExampleDate_Format_languageIndependence demonstrates that most formats ignore language
func ExampleDate_Format_languageIndependence() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC))
// ISO format is always the same regardless of language
dateEN := date.WithLang(quando.EN)
dateDE := date.WithLang(quando.DE)
fmt.Println("ISO (EN):", dateEN.Format(quando.ISO))
fmt.Println("ISO (DE):", dateDE.Format(quando.ISO))
fmt.Println("Same:", dateEN.Format(quando.ISO) == dateDE.Format(quando.ISO))
// Output:
// ISO (EN): 2026-02-09
// ISO (DE): 2026-02-09
// Same: true
}
// ExampleDate_FormatLayout demonstrates custom layout formatting
func ExampleDate_FormatLayout() {
date := quando.From(time.Date(2026, 2, 9, 14, 30, 0, 0, time.UTC))
// Common layouts
fmt.Println(date.FormatLayout("Monday, January 2, 2006"))
fmt.Println(date.FormatLayout("Mon, Jan 2, 2006"))
fmt.Println(date.FormatLayout("January 2, 2006"))
fmt.Println(date.FormatLayout("02 Jan 2006"))
// Output:
// Monday, February 9, 2026
// Mon, Feb 9, 2026
// February 9, 2026
// 09 Feb 2026
}
// ExampleDate_FormatLayout_german demonstrates German localization with custom layouts
func ExampleDate_FormatLayout_german() {
date := quando.From(time.Date(2026, 2, 9, 14, 30, 0, 0, time.UTC)).WithLang(quando.DE)
// German formats
fmt.Println(date.FormatLayout("Monday, 2. January 2006"))
fmt.Println(date.FormatLayout("Mon, 02. Jan 2006"))
fmt.Println(date.FormatLayout("2. January 2006"))
// Output:
// Montag, 9. Februar 2026
// Mo, 09. Feb 2026
// 9. Februar 2026
}
// ExampleDate_FormatLayout_custom demonstrates custom layouts with time components
func ExampleDate_FormatLayout_custom() {
date := quando.From(time.Date(2026, 2, 9, 14, 30, 45, 0, time.UTC))
// With time
fmt.Println(date.FormatLayout("Monday, January 2, 2006 at 15:04"))
fmt.Println(date.FormatLayout("Mon Jan 2 15:04:05 2006"))
fmt.Println(date.FormatLayout("2006-01-02 15:04:05"))
// German with time
dateDE := date.WithLang(quando.DE)
fmt.Println(dateDE.FormatLayout("Monday, 2. January 2006 um 15:04 Uhr"))
// Output:
// Monday, February 9, 2026 at 14:30
// Mon Feb 9 14:30:45 2026
// 2026-02-09 14:30:45
// Montag, 9. Februar 2026 um 14:30 Uhr
}
// ExampleDate_FormatLayout_comparison demonstrates comparing preset Format vs custom FormatLayout
func ExampleDate_FormatLayout_comparison() {
date := quando.From(time.Date(2026, 2, 9, 0, 0, 0, 0, time.UTC))
// Preset formats
fmt.Println("Format(Long):", date.Format(quando.Long))
fmt.Println("Format(ISO):", date.Format(quando.ISO))
// Custom layouts (equivalent)
fmt.Println("FormatLayout(custom):", date.FormatLayout("January 2, 2006"))
fmt.Println("FormatLayout(ISO):", date.FormatLayout("2006-01-02"))
// Custom layout flexibility
fmt.Println("FormatLayout(custom style):", date.FormatLayout("Mon, Jan 2"))
// Output:
// Format(Long): February 9, 2026
// Format(ISO): 2026-02-09
// FormatLayout(custom): February 9, 2026
// FormatLayout(ISO): 2026-02-09
// FormatLayout(custom style): Mon, Feb 9
}