metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2016-02-29 08:59 am

Форматирование даты-времени в go

And now for something completely different: чтобы описать произвольный формат даты-времени в go используется дичайшее решение: "укажите, как будет выглядеть в вашем формате дата 02/Jan/2006:15:04:05 -0700"
Т.е. month=1, day=2, year=2006/6, hour=15/3PM, minute=4, second=5, timezone=-7

Вроде бы однозначное представление получается, но выглядит после других языков дико.

[identity profile] berezovsky.livejournal.com 2016-02-29 06:16 am (UTC)(link)
да ёбаный в рот

[identity profile] slonopotamus.livejournal.com 2016-02-29 06:58 am (UTC)(link)
1. Где миллисекунды? Номер недели?
2. Что за упоротый формат у них?
3. ISO 8601, остальное сжигать
4. http://fuckinggodateformat.com/

[identity profile] lionet.livejournal.com 2016-02-29 10:04 am (UTC)(link)
ISO 8601 там по дефолту.

[identity profile] slonopotamus.livejournal.com 2016-02-29 10:27 am (UTC)(link)
А это чо?

Mon, 02 Jan 2006 15:04:05 -0700

[identity profile] lionet.livejournal.com 2016-02-29 10:41 am (UTC)(link)
package main

import "fmt"
import "time"

func main() {
    now := time.Now()

    // Prints out "2016-02-29 02:46:27.629354698 -0800 PST"
    fmt.Println(now)

    // Prints out "2016-02-29T10:46:27Z"
    fmt.Println(now.UTC().Format(time.RFC3339))

    // Prints out "2016 February, 02:46"
    fmt.Println(now.Format("2006 January, 15:04"))
}
Edited 2016-02-29 10:51 (UTC)

[identity profile] lionet.livejournal.com 2016-02-29 11:05 am (UTC)(link)
Поясню, что я тут накомментировал, а то я сам чуть не запутался.

1. Один из стандартных методов форматирования — RFC 3339, который и есть, с практической точки зрения, ISO 8601. Только бесплатный.

2. Стандартный способ представления времени в строку очень похож, но всё-таки не является ISO8601. Как минимум, таймзона там неправильно отформатирована. Откуда они взяли этот дефолт?..

3. Форматтеру действительно нужно дать строку с примером. Чтобы получить ISO 8601 нужно сделать value.Format(time.RFC3339), а если ещё без таймзоны, то value.UTC().Format(time.RFC3339). При этом time.RFC3339 — это просто predefined константа строки "2006-01-02T15:04:05Z07:00".

4. Форматтер там наивный, работать будет медленновато, формат не кэширует, но, видимо, подходит для сельской местности.

[identity profile] pewpewaction.livejournal.com 2016-02-29 08:25 am (UTC)(link)
Что-то я не распарсил. В Го один родной формат представления даты-времени, да и тот кривой; и что бы сделать по-нормальному нужно подключить несколько фреймворков с гитхаба?

[identity profile] metaclass.livejournal.com 2016-02-29 08:37 am (UTC)(link)
Представление там нормальное, а вот форматирование в строки - безумное, хоть и работает.

[identity profile] tonsky.livejournal.com 2016-02-29 11:37 am (UTC)(link)
А таймзоны с 15 или 30-минутным смещением умеет?

[identity profile] justy-tylor.livejournal.com 2016-02-29 08:49 am (UTC)(link)
Вот они, результаты скрещивания хипстеров с красноглазиками!

[identity profile] nivanych.livejournal.com 2016-02-29 09:19 am (UTC)(link)
Ви таки за ГМО?

[identity profile] justy-tylor.livejournal.com 2016-02-29 09:25 am (UTC)(link)
А почему ви таки спрашиваете?

[identity profile] nivanych.livejournal.com 2016-02-29 09:29 am (UTC)(link)
В сообщении, вы какбе осуждали селекцию "вот они, результаты скрещивания".
Вот я и предположил ;-)
Хотя и конечно, можно осуждать и тех, и других!

[identity profile] kiryl.livejournal.com 2016-02-29 12:49 pm (UTC)(link)
Там с парсингом даты-времени было веселее. Оно не принимало буквенное обозначение таймзоны (stdTZ), если оно не заканчивается на 'T'. MSK, например, мимо :)

https://github.com/golang/go/issues/3790