Skip to content

Possible Daylight Saving Time issue #290

@jlanzarotta

Description

@jlanzarotta

Hello,

Thanks for a great library, it is very helpful. I am looking to upgrade from v2.5.4 to v2.6.0; however, I ran into an issue with Daylight Savings Time and wanted to ask about what is going on...

To prove out the issue, I wrote a simple program that just uses the current time and prints it out in various formats.

Version 2.5.4

package main

import (
  "log"
  "time"
  "github.com/dromara/carbon/v2"
)

func main() {
    log.SetFlags(0)

    log.Printf("***** Using Go.Time\n")

    // Gets the current time
    t_now := time.Now()

    // Get the current timezone location
    location := t_now.Location()

    // Print the current timezone name
    log.Printf("Current Timezone[%s]\n", location.String())
    log.Printf("Current Time[%s]\n", t_now)

    log.Printf("***** Converting Go.Time -> Carbon\n")

    var c carbon.Carbon = carbon.NewCarbon(t_now)
    log.Printf("carbon timezone[%s].\n", c.Timezone())
    log.Printf("carbon IS08601 date/time[%s].\n", c.ToIso8601String())
    log.Printf("carbon RFC3339 date/time[%s].\n", c.ToRfc3339String())
    log.Printf("carbon IsDST[%v].\n", c.IsDST())

    log.Printf("***** Using Carbon\n")

    carbon.SetTimezone(carbon.UTC)
    carbon.SetWeekStartsAt(carbon.Sunday)
    carbon.SetLocale("en")

    var now carbon.Carbon = carbon.Now()
    log.Printf("  UTC String()            now=[%s]\n", now.String())
    log.Printf("  UTC ToString()          now=[%s]\n", now.ToString())
    log.Printf("  UTC ToDateTimeString    now=[%s]\n", now.ToDateTimeString())

    log.Printf("Local now=[%s]\n", now.SetTimezone(carbon.Local))
    log.Printf("Local String()            now=[%s]\n", now.String())
    log.Printf("Local ToString()          now=[%s]\n", now.ToString())
    log.Printf("Local ToDateTimeString()  now=[%s]\n", now.ToDateTimeString())

    log.Printf("  EST now=[%s]\n", now.SetTimezone(carbon.EST))
    log.Printf("  EST String()            now=[%s]\n", now.String())
    log.Printf("  EST ToString()          now=[%s]\n", now.ToString())
    log.Printf("  EST ToDateTimeString()  now=[%s]\n", now.ToDateTimeString())
}

Version 2.6.0

package main

import (
    "log"
    "time"

    "github.com/dromara/carbon/v2"
)

func main() {
    log.SetFlags(0)

    log.Printf("***** Using Go.Time\n")

    // Gets the current time
    t_now := time.Now()

    // Get the current timezone location
    location := t_now.Location()

    // Print the current timezone name
    log.Printf("Current Timezone[%s]\n", location.String())
    log.Printf("Current Time[%s]\n", t_now)

    log.Printf("***** Converting Go.Time -> Carbon\n")

    var c carbon.Carbon = *carbon.NewCarbon(t_now)
    log.Printf("carbon timezone[%s].\n", c.Timezone())
    log.Printf("carbon IS08601 date/time[%s].\n", c.ToIso8601String())
    log.Printf("carbon RFC3339 date/time[%s].\n", c.ToRfc3339String())
    log.Printf("carbon IsDST[%v].\n", c.IsDST())

    log.Printf("***** Using Carbon\n")

    carbon.SetLayout(carbon.ISO8601Layout)
    carbon.SetTimezone(carbon.UTC)
    carbon.SetWeekStartsAt(carbon.Sunday)
    carbon.SetLocale("en")

    var now carbon.Carbon = *carbon.Now()
    log.Printf("  UTC String()            now=[%s]\n", now.String())
    log.Printf("  UTC ToString()          now=[%s]\n", now.ToString())
    log.Printf("  UTC ToDateTimeString    now=[%s]\n", now.ToDateTimeString())

    log.Printf("Local now=[%s]\n", now.SetTimezone(carbon.Local))
    log.Printf("Local String()            now=[%s]\n", now.String())
    log.Printf("Local ToString()          now=[%s]\n", now.ToString())
    log.Printf("Local ToDateTimeString()  now=[%s]\n", now.ToDateTimeString())

    log.Printf("  EST now=[%s]\n", now.SetTimezone(carbon.EST))
    log.Printf("  EST String()            now=[%s]\n", now.String())
    log.Printf("  EST ToString()          now=[%s]\n", now.ToString())
    log.Printf("  EST ToDateTimeString()  now=[%s]\n", now.ToDateTimeString())
}

The output for each program is as follows...

Version 2.5.4

***** Using Go.Time
Current Timezone[Local]
Current Time[2025-03-26 12:20:46.4571965 -0400 EDT m=+0.000508701]
***** Converting Go.Time -> Carbon
carbon timezone[EDT].
carbon IS08601 date/time[2025-03-26T12:20:46-04:00].
carbon RFC3339 date/time[2025-03-26T12:20:46-04:00].
carbon IsDST[true].
***** Using Carbon
  UTC String()            now=[2025-03-26 12:20:46]
  UTC ToString()          now=[2025-03-26 12:20:46.4587764 -0400 EDT]
  UTC ToDateTimeString    now=[2025-03-26 12:20:46]
Local now=[2025-03-26 12:20:46]
Local String()            now=[2025-03-26 12:20:46]
Local ToString()          now=[2025-03-26 12:20:46.4587764 -0400 EDT]
Local ToDateTimeString()  now=[2025-03-26 12:20:46]
  EST now=[2025-03-26 11:20:46]
  EST String()            now=[2025-03-26 12:20:46]
  EST ToString()          now=[2025-03-26 12:20:46.4587764 -0400 EDT]
  EST ToDateTimeString()  now=[2025-03-26 12:20:46]

Vs

Version 2.6.0

***** Using Go.Time
Current Timezone[Local]
Current Time[2025-03-26 12:21:47.744579 -0400 EDT m=+0.000558001]
***** Converting Go.Time -> Carbon
carbon timezone[Local].
carbon IS08601 date/time[2025-03-26T12:21:47-04:00].
carbon RFC3339 date/time[2025-03-26T12:21:47-04:00].
carbon IsDST[true].
***** Using Carbon
  UTC String()            now=[2025-03-26T16:21:47+00:00]
  UTC ToString()          now=[2025-03-26 16:21:47.7451059 +0000 UTC]
  UTC ToDateTimeString    now=[2025-03-26 16:21:47]
Local now=[2025-03-26T16:21:47+00:00]
Local String()            now=[2025-03-26T16:21:47+00:00]
Local ToString()          now=[2025-03-26 16:21:47.7451059 +0000 UTC]
Local ToDateTimeString()  now=[2025-03-26 16:21:47]
  EST now=[2025-03-26T11:21:47-05:00]
  EST String()            now=[2025-03-26T11:21:47-05:00]
  EST ToString()          now=[2025-03-26 11:21:47.7451059 -0500 EST]
  EST ToDateTimeString()  now=[2025-03-26 11:21:47]

As you might have notices, the EST times are off by 1 hour between the two versions. Version 2.5.4 says -0400 EST, while version 2.6.0 says -0500 EST. Is there something I am not doing correctly, or is this an issue in the library? Again, thanks for the library, I greatly appreciate it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    QuestionIndicates that an issue, pull request, or discussion needs more information

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions