2015-07-27 3 views
-1

Я играю с часовым поясом и заметил что-то странное.Получить заданный часовой пояс timestamp

Я сейчас в часовом поясе BST, что на час раньше GMT.

 now := time.Now() 
     location, _ := time.LoadLocation("Atlantic/Cape_Verde") 
     timeAtZone := now.In(location) 
     fmt.Println(timeAtZone) 
     timestamp = timeAtZone.Unix() 
     fmt.Println(timestamp) 
     fmt.Println(now.Add(-time.Hour).UTC().Unix()) 
     fmt.Println(now.UTC().Unix()) 

Вы заметите, что временная метка имеет значение BST моего текущего часового пояса.

Как получить временную метку GMT ???

http://play.golang.org/p/oq0IRYa0h7

ответ

7

Unix время - абсолютный. Нет времени «BST Unix». Там нет «Atlantic/Cape_Verde» Unix времени.»Существует только Unix времени. Это количество секунд, прошедших с определенного момента (00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970, not counting leap seconds).

Временные зоны связаны с представления времени, а не времени Это тот самый момент для вас, как и для меня, где бы мы ни находились в мире (оставив Эйнштейна в стороне на данный момент). Мы просто называем этот момент разными вещами. Установка местоположения на *Time просто указывает, как вы хотелось бы отобразить время.Так что если по «timestamp» вы имеете в виду «строку, представляющую время», вы можете получить временную метку UTC с time.Now().UTC().String().

1

Убедитесь, что вы проверить свои ошибки, я предполагаю, что это говорит вам, что есть проблема.

Вы проверили: http://golang.org/pkg/time/#LoadLocation

Ваш часовой пояс в: $ GOROOT/Lib/времени/zoneinfo.zip?

Для меня:

time.LoadLocation("CDT") // my time zone 
time.LoadLocation("CST") 

И результат ошибки.

Чтобы получить часовой пояс, я должен сделать:

time.LoadLocation("America/Chicago") 

Убедитесь f.Timezone является действительным.

+0

К сожалению f.timezone был взят из код .. Я обновил его с помощью правильного часового пояса «Atlantic/Cape_Verde» –

-1

Наконец, после многократного чтения API времени.

Эта работа дала мне то, что мне нужно.

now := time.Now() 
    location, _ := time.LoadLocation("Atlantic/Cape_Verde") 
    _, offset := now.In(location).Zone() 

    fmt.Println(now.UTC().Unix() + int64(offset)) 

Так зона повторно название часового пояса и смещение (в этом случае -3600) поэтому я добавить его в Utc метку времени UNIX .. и что это действительно

+0

Я не знаю, с какой неисправной системой вы работаете, где вы «требуете» этого, но это ** не ** правильное использование unix (см. [Ответ Роба] (http://stackoverflow.com/a/31654679/55504)). Я бы удостоверился, что системы, с которыми вы имеете дело, правильно настроили свое время и зону и исправили любые сломанные подсистемы, которые используют/возвращают такие фиктивные unix-подобные, но не unix-времена. –

+0

@DaveC Вы не поймете. Я написал тесты, чтобы доказать, что это удовлетворяет условиям, которые мы изложили. –

Смежные вопросы