TimeRules

package module
v1.0.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 12, 2024 License: GPL-3.0 Imports: 19 Imported by: 0

README

Fork GitHub Release CodeQL Tests

Go Report Card

GitHub repo file or directory count GitHub code size in bytes GitHub repo size

Модуль поддержки произвольных временных меток

(привязка к правилам формирования времени)

Установка:
go mod init github.com/Bookshelf-Writer/TimeRules

Внешние модули
  • github.com/mailru/easyjson - Внедрен для ускорения marshal/unmarshal структур JSON
  • golang.org/x/crypto - Используется для генерации подписей в blake2b

Особенности:
  • Позволяет полноценно работать с датами, пользуясь пользовательскими правилами времени
  • Минимальная единица времени минута
  • Минималистичная структура для описывания правил времени
  • Позволяет описать абсолютно уникальный случай времени, не ограниченный стандартным 60m/24h/365d
  • Позволяет описать месяцы с разным количеством дней
  • Поддерживает пользовательские таймзоны
  • Есть шаблонизатор позволяющий описать как именно отдавать дату строкой (дата, время, полная запись)

Функционал:
  1. Работа с правилами времени

    • Чтение правил из файла (только поддерживаемые форматы)
    • Проверка правила на корректность
    • Создание файла правила (только поддерживаемые форматы)
    • Работа с правилами в формате строк и массива байт
  2. Работа со временем

    • Получение встроенного правила времени (классика с 60m/24h/365d)
    • Работа с датами
    • Проверка времени на соответствие правилу
    • Перевод времени между разными часовыми поясами
    • Возможность перевода между разными временными зонами (правила времени)
    • Вывод времени строкой согласно форматированию
    • Обработка произвольного форматирования для получения строки из даты
    • более подробно смотрите в описании методов

Поддерживаемые форматы:
  • json - Человеко-понятный формат описания правил времени
  • tvr - Машинно-понятный формат описания времени. Оптимизированный для хранения и отдачи. Имеется встроенная проверка целостности.

Физические ограничения:
MIN MAX
Минут в часе 1 65534
Часов в дне 1 65534
Дней в месяце 1 65534
Месяцев в году 1 65534
Предел года -9×1018 9×1018
Предел смещения таймзоны -9×1018 9×1018
Короткое название месяца (длинна) 1 4
Полное название месяца (длинна) 1 32
Ключ таймзоны (длинна) 1 64


Правила времени

Структура JSON-файла
{
  "name": "varchar",
  "description": "text",
  "inf": {
    "ver": "1.0.0",
    "creator": "creator name"
  },

  "format": {
    "date": "${Y}/${m}/${d}",
    "time": "${h}:${i}",
    "full": "${Y}/${m}/${d} ${h}:${i} ${Z}"
  },
  "year": {
    "min": -10000,
    "max": 10000
  },
  "maxHour": 10,
  "maxMin": 20,

  "month": [
    {"fullName": "month 1", "shortName": "X", "days": 10},
    {"fullName": "month 2", "shortName": "Y", "days": 20},
    {"fullName": "month 3", "shortName": "Z", "days": 30}
  ],

  "timezones": {
    "name1": 0,
    "name2": 60,
    "name3": -60
  }
}
  • Все поля обязательные
    • Перечисление в month должно быть хотя-бы одно.
    • Указатель в timezones должен быть хотя-бы один.
  • name это название правила. Оно должно быть уникальным. Длинна минимум 3, максимум 32. Правило записи ^[a-zA-Z0-9 \-.:;_+@]*$
  • description описывает кратко правило. Правило записи ^[^'"\\]+$
  • inf описывает системную информацию.
    • ver это номерная версия правила. Не влияет на функционал, необходимо для "визуального" согласования разных редакций одного правила. Правило записи ^[0-9\.]*$
    • creator это имя\логин\ник\контакт создателя\редактора правила. Не влияет на функционал. Правило записи ^[^'"\\%&,/]+$
  • format описывает шаблон формирования строчного представления даты. Подробнее о правилах форматирования ниже.
    • date правило описания даты.
    • time правило описания времени.
    • full правило описания даты-времени.
  • year допустимые пределы года.
  • maxHour максимальное число для часов. Для 24-часов максимальным будет 23.
  • maxMin максимальное число для минут. Для 60-минутного часа максимальным будет 59.
  • month массив описания месяца. Каждая запись описывает конкретный месяц. Порядок важен. Количество дней в году насчитывается суммированием days в каждом месяце.
    • fullName полное название месяца. Правило записи ^[^'"\\%&,/]+$
    • shortName краткое название месяца. Правило записи ^[a-zA-Z0-9]*$
    • days максимальное число для дней в текущем месяце.
  • timezones описание возможных смещений часовых поясов. Должна быть хотя-бы одна запись. Смещение указывается целым числом в минутах.

Форматирование
Ключи
KEY MATH
y Числовое представление года
Y y
n Порядковый номер месяца
m n
F Полное наименование месяца
M Сокращённое наименование месяца
t Количество дней в указанном месяце
j День месяца
d j
z Порядковый номер дня в году
G Часы
H G
h G
I Минуты
i I
U Кол-во минут прошедших от точки отчета без смешения
e Идентификатор часового пояса
Z Смещение часового пояса
Математические операции
SYMBOL X1 X2 X3
s Получение фрагмента Позиция от конца строки Размер заполнения 0
m Целая часть от деления Делитель Позиция от конца строки Размер заполнения
n Остаток от деления Делитель Позиция от конца строки Размер заполнения
  • В случае если Позиция от конца строки больше фактической длинны строки то сначала добавляются недостающие нули
  • Размер заполнения указывает сколько символов показывать, начиная точки отсчета. Используется с Позиция от конца строки для получения фрагмента числа. Примеры ниже.
Примеры
INPUT OUTPUT
${Y} 2024 Полное числовое представление года
{Ys2} 24 Обрезаный год
${H} 8 Часы без ведущего нуля
${Hs2}:${Is2} 08:04 Формалое представление времени с ведущим нулем
${e} Etc/GMT+1 Идентификатор часового пояса
${Y}-${M}-${ds:2} 2024-FEB-03 Формальное представление даты с текстовым месяцев и ведушим нулем дня
{Zm60} -1 Формальное представление смешения в часах
${m}.${Yn1000::3}.M${Ym1000} 113.004.M40 Формальное представление даты в Warhammer-40K


Mirrors

Documentation

Index

Constants

View Source
const (
	GlobalName       string = "TimeRules"
	GlobalDateUpdate string = "06-12-2024"
	GlobalHash       string = "a70c89fb72bbd7d78b00989110fe4a67fa0cf04f"

	GlobalVersion      string = "v1.0.3"
	GlobalVersionMajor string = "v1"
	GlobalVersionMinor uint16 = 0
	GlobalVersionPatch uint16 = 3
)

Variables

This section is empty.

Functions

func FileTVRreadByte

func FileTVRreadByte(filePath string) ([]byte, error)

Парсинг правила из файла с расширением fileExTVR в массив байт

func FileTVRreadByteIO

func FileTVRreadByteIO(file io.Reader) ([]byte, error)

Парсинг правила из бинарого представления фала с расширением fileExTVR в массив байт

func FileTVRwrite

func FileTVRwrite(ruleObj *TimeConfigurationRulesObj, dirPath string, fileName string) error

Запись правила в файл с расширением fileExTVR

func FileTVRwriteByte

func FileTVRwriteByte(ruleObj *TimeConfigurationRulesObj) ([]byte, error)

Запись правила в файл с расширением fileExTVR в массив байт

func FileWrite

func FileWrite(ruleObj *TimeConfigurationRulesObj, dirPath string, ex fileEx) error

Запись правила в файл с указаным расширением

func JSONwrite

func JSONwrite(ruleObj *TimeConfigurationRulesObj, dirPath string, fileName string) error

Запись правила в json-файл

func JSONwriteByte

func JSONwriteByte(ruleObj *TimeConfigurationRulesObj) ([]byte, error)

Запись правила в json

func JSONwritePretty

func JSONwritePretty(ruleObj *TimeConfigurationRulesObj, dirPath string, fileName string) error

Запись правила в json-файл с отступами

func JSONwritePrettyByte

func JSONwritePrettyByte(ruleObj *TimeConfigurationRulesObj) ([]byte, error)

Запись правила в json с отступами

Types

type DateObj

type DateObj struct {
	Year  int64  `json:"year"`  //< Год
	Month uint16 `json:"month"` //< Месяц
	Day   uint16 `json:"day"`   //< День
}

DateObj Группа даты

func (DateObj) MarshalEasyJSON

func (v DateObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (DateObj) MarshalJSON

func (v DateObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (DateObj) String

func (obj DateObj) String() string

func (*DateObj) UnmarshalEasyJSON

func (v *DateObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*DateObj) UnmarshalJSON

func (v *DateObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

type DateTimeObj

type DateTimeObj struct {
	Type string `json:"type"` //< Тип календаря

	Date     DateObj `json:"date"`     //<	Дата
	Time     TimeObj `json:"time"`     //<	Время
	Timezone string  `json:"timezone"` //<	Таймзона для расчета смещения
}

Структура универсальной точки времени

func (DateTimeObj) MarshalEasyJSON

func (v DateTimeObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (DateTimeObj) MarshalJSON

func (v DateTimeObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (DateTimeObj) String

func (obj DateTimeObj) String() string

func (*DateTimeObj) UnmarshalEasyJSON

func (v *DateTimeObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*DateTimeObj) UnmarshalJSON

func (v *DateTimeObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

type FF

type FF struct {
	H []byte //	hash
	D []byte //	data
}

Структура сохраняемого файла

type FormatsInfoObj

type FormatsInfoObj struct {
	Date string `json:"date"` //	Представление даты
	Time string `json:"time"` //	Представление времени
	Full string `json:"full"` //	Представление временного объекта
}

func (FormatsInfoObj) MarshalEasyJSON

func (v FormatsInfoObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (FormatsInfoObj) MarshalJSON

func (v FormatsInfoObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (*FormatsInfoObj) UnmarshalEasyJSON

func (v *FormatsInfoObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*FormatsInfoObj) UnmarshalJSON

func (v *FormatsInfoObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

type MonthObj

type MonthObj struct {
	FullName  string `json:"fullName"`  //	Полноное название месяца
	ShortName string `json:"shortName"` //	Сокращенное название месяца латиницей
	Days      uint16 `json:"days"`      //	Количество дней в месяце
}

MonthObj Обьект месяца

func (MonthObj) MarshalEasyJSON

func (v MonthObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (MonthObj) MarshalJSON

func (v MonthObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (*MonthObj) UnmarshalEasyJSON

func (v *MonthObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*MonthObj) UnmarshalJSON

func (v *MonthObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

type SystemInfoObj

type SystemInfoObj struct {
	Ver     string `json:"ver"`     //	Версия файла. Для отслеживания изменений по файлу
	Creator string `json:"creator"` //	Имя\логин\иное создателя\редактора
}

SystemInfoObj Системная информация по объекту

func (SystemInfoObj) MarshalEasyJSON

func (v SystemInfoObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (SystemInfoObj) MarshalJSON

func (v SystemInfoObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (*SystemInfoObj) UnmarshalEasyJSON

func (v *SystemInfoObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*SystemInfoObj) UnmarshalJSON

func (v *SystemInfoObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

type TimeConfigurationRulesObj

type TimeConfigurationRulesObj struct {
	Name        string `json:"name"`        //< Уникальное название правила
	Description string `json:"description"` //< Описание правила

	INF        SystemInfoObj  `json:"inf"`    //<	Системная информация по файлу
	FormatsDef FormatsInfoObj `json:"format"` //<	Форматирование строчного представления даты по умолчанию

	Year    YearLimitsObj `json:"year"`    //< Годовые ограничения
	MaxHour uint16        `json:"maxHour"` //< Максимальное количество часов в дне
	MaxMin  uint16        `json:"maxMin"`  //< Максимальное количество минут в часе

	Month      []MonthObj       `json:"month"`      //< Массив месяцев. Порядок важен
	DaysInYear uint64           `json:"daysInYear"` //<	Дней в году (автоматически генерируется из месяцев)
	Timezones  map[string]int64 `json:"timezones"`  //< Уникальные часовые зоны со смещением в минутах
}

Базовая стукрута конфигурации времени

func DefRules

func DefRules() (TimeConfigurationRulesObj, error)

Получение структуры времени 'по умолчанию' (встроена в библиотеку)

func FileRead

func FileRead(filePath string) (TimeConfigurationRulesObj, error)

Парсинг правила из файла

func FileReadIO

func FileReadIO(file io.Reader, ex fileEx) (TimeConfigurationRulesObj, error)

Парсинг правила из бинарого представления фала

func FileTVRread

func FileTVRread(filePath string) (TimeConfigurationRulesObj, error)

Парсинг правила из файла с расширением fileExTVR

func FileTVRreadIO

func FileTVRreadIO(file io.Reader) (TimeConfigurationRulesObj, error)

Парсинг правила из бинарого представления фала с расширением fileExTVR

func JSONread

func JSONread(filePath string) (TimeConfigurationRulesObj, error)

Парсинг правила из json

func JSONreadIO

func JSONreadIO(file io.Reader) (TimeConfigurationRulesObj, error)

Парсинг правила из бинарого представления json

func (*TimeConfigurationRulesObj) CheckErrors

func (obj *TimeConfigurationRulesObj) CheckErrors() (errors []string)

Проверяет структуру на синтаксические ошибки

func (*TimeConfigurationRulesObj) Date

func (obj *TimeConfigurationRulesObj) Date(year int64, month uint16, day uint16) DateObj

Создание только даты (автоформатирование если зашли за пределы)

func (*TimeConfigurationRulesObj) DateFull

func (obj *TimeConfigurationRulesObj) DateFull(year int64, month uint16, day uint16, timezone string) DateTimeObj

Создание точки времени напрямую

func (*TimeConfigurationRulesObj) DateTime

func (obj *TimeConfigurationRulesObj) DateTime(dateObj DateObj, timeObj TimeObj, timezone string) DateTimeObj

Создание точки времени (никаких проверок)

func (*TimeConfigurationRulesObj) DateTimeToMinutes

func (obj *TimeConfigurationRulesObj) DateTimeToMinutes(dateObj DateObj, timeObj TimeObj) *big.Int

Перевод даты в число минут

func (*TimeConfigurationRulesObj) Format

func (obj *TimeConfigurationRulesObj) Format(dateTime *DateTimeObj, layout string) (text string)

Вывод форматированной даты

func (*TimeConfigurationRulesObj) LocationSet

func (obj *TimeConfigurationRulesObj) LocationSet(DateTime DateTimeObj, timezone string) (dateTime DateTimeObj, err error)

Изменение таймзоны со смешением временных диапазонов

func (TimeConfigurationRulesObj) MarshalEasyJSON

func (v TimeConfigurationRulesObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (TimeConfigurationRulesObj) MarshalJSON

func (v TimeConfigurationRulesObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (*TimeConfigurationRulesObj) MinutesToDate

func (obj *TimeConfigurationRulesObj) MinutesToDate(totalMinutes *big.Int) (dateObj DateObj, timeObj TimeObj)

Перевод числа минут в дату

func (*TimeConfigurationRulesObj) MonthFull

func (obj *TimeConfigurationRulesObj) MonthFull(date *DateObj) string

Полное название месяца человеко-понятно

func (*TimeConfigurationRulesObj) MonthShort

func (obj *TimeConfigurationRulesObj) MonthShort(date *DateObj) string

Сокращенное название месяца

func (*TimeConfigurationRulesObj) StringDate

func (obj *TimeConfigurationRulesObj) StringDate(date DateObj) string

Вывод даты по умолчанию

func (*TimeConfigurationRulesObj) StringDateTime

func (obj *TimeConfigurationRulesObj) StringDateTime(dateTime DateTimeObj) string

Вывод по умолчанию

func (*TimeConfigurationRulesObj) StringTime

func (obj *TimeConfigurationRulesObj) StringTime(time TimeObj) string

Вывод времени по умолчанию

func (*TimeConfigurationRulesObj) Time

func (obj *TimeConfigurationRulesObj) Time(hour uint16, minute uint16) TimeObj

Создание только времени (автоформатирование если зашли за пределы)

func (*TimeConfigurationRulesObj) TimezoneList

func (obj *TimeConfigurationRulesObj) TimezoneList() []string

Получение списка всех доступных таймзон

func (*TimeConfigurationRulesObj) UnmarshalEasyJSON

func (v *TimeConfigurationRulesObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*TimeConfigurationRulesObj) UnmarshalJSON

func (v *TimeConfigurationRulesObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

func (*TimeConfigurationRulesObj) Valid

func (obj *TimeConfigurationRulesObj) Valid(tvr *DateTimeObj) error

Проверка времени на соответствие стандартам

type TimeObj

type TimeObj struct {
	Hour uint16 `json:"hour"` //< Часы
	Min  uint16 `json:"min"`  //< Минуты
}

TimeObj Группа времени

func (TimeObj) MarshalEasyJSON

func (v TimeObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (TimeObj) MarshalJSON

func (v TimeObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (TimeObj) String

func (obj TimeObj) String() string

func (*TimeObj) UnmarshalEasyJSON

func (v *TimeObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*TimeObj) UnmarshalJSON

func (v *TimeObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

type YearLimitsObj

type YearLimitsObj struct {
	Min int64 `json:"min"` //	Минимально допустимый год
	Max int64 `json:"max"` //	Максимально допустимый год
}

YearLimitsObj Лимит времени в годах

func (YearLimitsObj) MarshalEasyJSON

func (v YearLimitsObj) MarshalEasyJSON(w *jwriter.Writer)

MarshalEasyJSON supports easyjson.Marshaler interface

func (YearLimitsObj) MarshalJSON

func (v YearLimitsObj) MarshalJSON() ([]byte, error)

MarshalJSON supports json.Marshaler interface

func (*YearLimitsObj) UnmarshalEasyJSON

func (v *YearLimitsObj) UnmarshalEasyJSON(l *jlexer.Lexer)

UnmarshalEasyJSON supports easyjson.Unmarshaler interface

func (*YearLimitsObj) UnmarshalJSON

func (v *YearLimitsObj) UnmarshalJSON(data []byte) error

UnmarshalJSON supports json.Unmarshaler interface

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL