Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mention time duration in days so that golang viper config can be loaded without errors?

Tags:

go

viper-go

I have two configurations in the .env file as following

MAX_TOKEN_EXPIRY_DAYS=30d
ACCESS_TOKEN_DURATION=30m

The struct in golang to load the config looks like following

type AppConfig struct {
    MaxTokenExpiry      time.Duration `mapstructure:"MAX_TOKEN_EXPIRY_DAYS"`
    AccessTokenDuration time.Duration `mapstructure:"ACCESS_TOKEN_DURATION"`
}

Now the when I am trying to load the config, I am getting the following error

* error decoding 'MAX_TOKEN_EXPIRY_DAYS': time: unknown unit "d" in duration "30d"

This may mean that I the issue was with MAX_TOKEN_EXPIRY_DAYS=30d line as it is not able to recognise the d tag. But the m tag in ACCESS_TOKEN_DURATION=30m runs well as time.Duration in golang is able to parse it well.

In the time package source code, I see the following constructs

Nanosecond  Duration = 1
Microsecond          = 1000 * Nanosecond
Millisecond          = 1000 * Microsecond
Second               = 1000 * Millisecond
Minute               = 60 * Second
Hour                 = 60 * Minute

Is there any way to denote days in the config?

like image 489
Mayukh Sarkar Avatar asked Oct 27 '25 04:10

Mayukh Sarkar


1 Answers

It is because the ParseDuration called on your time string does not support d as a unit suffix

Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".

You are better off using the hours equivalent of 30d i.e. 720h to resolve the ambiguity.

Also see issue/explanation in golang/go for why the language designers decided to go with the choice. Why doesn't time.ParseDuration() support days? #17767

like image 108
Inian Avatar answered Oct 30 '25 07:10

Inian



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!