Формат даты

Страницы: 1
RSS
Формат даты
 
Задача: написать функцию форматирования даты:
Код
_DateFormat(date, input, output),
где date - дата в строковом формате,
input - формат ввода,
output - формат вывода.

Пример:
Код
_DateFormat("11.02.2015", "dd.mm.yyyy", "yyyymmdd")

На выходе получаем: "20150211"

Есть идеи, как это осуществить?
Надо делать так, как надо. А как не надо - делать не надо.
 
1. Формат dd.mm.yyyy заменяете на (%d%d)%p(%d%d)%p(%d%d%d%d)
2. применяете к строке даты функцию string.match по маске выше. Получаете 3 строки.
3. складываете эти 3 полученные строчки как вам нужно
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Со 2-м и 3-м пунктом понятно.
По 1-му пункту нужно именно задавать в "человеческом" формате: "dd.mm.yyyy", "yyyy-mm-dd", "dd/mm/yy", "yyyymmdd" и т.д.
Можно как в Эксель: "D.M.YY", "YY-M-D", "D/M/Y", "YYMD"
Надо делать так, как надо. А как не надо - делать не надо.
 
Сделайте соответствие.

formats =
{    "dd.mm.yyyy" = "(%d%d)%p(%d%d)%p(%d%d%d%d)",
    "ddmmyy"   = "(%d%d)(%d%d)(%d%d%d%d",
 и т.д.
}
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
или так:

convert =
{    "dd.mm.yyyy"  =  f1,
     "ddmmyyyy"   = f2,
}

function f1()
 нечто
end
function f2()
 нечто
end
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
Серж пишет:
Задача: написать функцию форматирования даты:
Код
 _DateFormat(date, input, output), 
где date - дата в строковом формате,
input - формат ввода,
output - формат вывода.

Пример:
Код
 _DateFormat("11.02.2015", "dd.mm.yyyy", "yyyymmdd")
 

На выходе получаем: " 20150211 "

Есть идеи, как это осуществить?

Код
function DateFormat(date, input_fmt, output_fmt)
   
   local day = tonumber(date:sub(input_fmt:find("([d|D]+)")))
   local month = tonumber(date:sub(input_fmt:find("([m|M]+)")))
   local year = tonumber(date:sub(input_fmt:find("([Y|y]+)")))
   
   local d_start, d_end = output_fmt:find("([d|D]+)")
   local m_start, m_end = output_fmt:find("([m|M]+)")
   local y_start, y_end = output_fmt:find("([Y|y]+)")
   
   local outstr = output_fmt:gsub("([d|D]+)", string.format("%0".. d_end-d_start+1 .."d", day))
   local outstr = outstr:gsub("([m|M]+)", string.format("%0".. m_end-m_start+1 .."d", month))
   local outstr = outstr:gsub("([y|Y]+)", string.format("%0".. y_end-y_start+1 .."d", year))
   return outstr
end

print(DateFormat("11.02.2015", "dd.mm.yyyy", "yyyy.mm.dd")) -- 2015.02.11
print(DateFormat("11.02.2015", "dd.mm.yyyy", "mm.dd.YYYY")) -- 02.11.2015
print(DateFormat("20150201", "yyyymmdd", "yyyy mmmm dd"))   -- 2015 0002 01
print(DateFormat("20150201", "yyyymmdd", "yyyy mmmm d"))   -- 2015 0002 1
print(DateFormat("20150201", "yyyymmdd", "yyyy mm dd"))      -- 2015 02 01
print(DateFormat("01/02/1999", "dd/mm/yyyy", "yyyy/mm/dd"))   -- 1999/02/01
 


без всяких проверок, вставьте их сами если надо
 
Michael Bulychev, спасибо.
Однако, маленькая ремарка: в паттернах Lua нет "или", поэтому использование символа "|" будет лишним
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Серж пишет:
Michael Bulychev , спасибо.
Однако, маленькая ремарка: в паттернах Lua нет " или ", поэтому использование символа " | " будет лишним
Да, спасибо. Издержки PCRE.
 
Если без особых выкрутасов, то можно упростить:

function DateFormat(date, input_fmt, output_fmt)
  local day = date:sub(input_fmt:find("([d|D]+)")
  local month = date:sub(input_fmt:find("([m|M]+)")
  local year = date:sub(input_fmt:find("([Y|y]+)")
  local outstr = output_fmt:gsub("([d|D]+)",  day)
  local outstr = outstr:gsub("([m|M]+)",  month)
  local outstr = outstr:gsub("([y|Y]+)", year)
  return outstr
end

примерно в 2 раза быстрее.
 
Цитата
Николай Камынин пишет:
Если без особых выкрутасов, то можно упростить:

function DateFormat(date, input_fmt, output_fmt)
local day = date:sub(input_fmt:find("([d|D]+)" ;)
local month = date:sub(input_fmt:find("([m|M]+)" ;)
local year = date:sub(input_fmt:find("([Y|y]+)" ;)
local outstr = output_fmt:gsub("([d|D]+)", day)
local outstr = outstr:gsub("([m|M]+)", month)
local outstr = outstr:gsub("([y|Y]+)", year)
return outstr
end

примерно в 2 раза быстрее.
Добрый день.
Только работает не так как в моем примере.
 
Добрый день,
ну да, "без выкрутасов":
-------------------------------
есть общепринятые форматы дат.
А это:  2015 0002 01,  2015 0002 01 не дата
и не число.
а последовательность цифр и пробелов.
 
Добрый день!
А как без ифов и прочего отформатировать число 1 в 01?
Как задать формат отображения с кол-вом разрядов, что-ли..
например хочу 1 в трех разрядах, получаю - 001
в двух - 01
если число 12 то оно 12 и на выходе.
Как то просто должно делаться..
Помогите, пожалуйста.
 
Цитата
Viktor MMM пишет:
Добрый день!
А как без ифов и прочего отформатировать число 1 в 01?
Как задать формат отображения с кол-вом разрядов, что-ли..
например хочу 1 в трех разрядах, получаю - 001
в двух - 01
если число 12 то оно 12 и на выходе.
Как то просто должно делаться..
Помогите, пожалуйста.
string.format("%02i",number)
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Спасибо, большое, Михаил! То,что нужно. Перебирал форматы, не догадался.
Страницы: 1
Читают тему
Наверх