如何将Rails%d/%m/%Y日期格式字符串转换为dd/mm/yyyy

How to convert Rails %d/%m/%Y date format string to dd/mm/yyyy?

本文关键字:字符串 转换 dd yyyy mm 格式 日期 Rails%d      更新时间:2023-09-26

我在Rails初始化器中定义了以下日期格式:

Date::DATE_FORMATS[:default] = '%d/%m/%Y'

我想将这个日期格式字符串(不是实际的日期对象)传递给一个基于JavaScript的日期选择器小部件。但是,日期选择器只接受没有%的格式字符串。例如,如果要将上面的日期格式字符串传递给小部件,则需要将其转换为dd/mm/YYYY

我能做转换的最简单的方法是什么?或者有没有一种我甚至不需要的方式?

这将使您能够将从数据选择器中选择的日期保存到数据库中,因为它将使用日期轨道格式

$(".date-single-view").datepicker({
  dateFormat: "yyyy-mm-dd"
});

您可以使用strftime()方法例如d1.strftime('%d/%m/%Y');

有关更多详细信息,您可以查看此链接strftime

使用映射和支持函数替换的regex方法可以最容易地完成这类操作。

来自日期选择器文档:

format
String. Default: “mm/dd/yyyy”
The date format, combination of d, dd, D, DD, m, mm, M, MM, yy, yyyy.
    d, dd: Numeric date, no leading zero and leading zero, respectively. Eg, 5, 05.
    D, DD: Abbreviated and full weekday names, respectively. Eg, Mon, Monday.
    m, mm: Numeric month, no leading zero and leading zero, respectively. Eg, 7, 07.
    M, MM: Abbreviated and full month names, respectively. Eg, Jan, January
    yy, yyyy: 2- and 4-digit years, respectively. Eg, 12, 2012.

在Ruby中(请参阅strftime格式):

STRFTIME_TO_DATEPICKER = {
  '-d'  => 'd',   # numeric date, no leading zero
  'd'   => 'dd',  # numeric date, with leading zero
  'a'   => 'D',   # abbreviated weekday name (e.g., Mon)
  'A'   => 'DD',  # full weekday name (e.g., Monday)
  '-m'  => 'm',   # numeric month, no leading zero
  'm'   => 'mm',  # numeric month, with leading zero
  'b'   => 'M',   # abbreviated month name (e.g., Jan)
  'B'   => 'MM',  # full month name (e.g., January)
  'y'   => 'yy',  # 2-digit year
  'Y'   => 'yyyy' # 4-digit year
}
puts '%d/%m/%Y'.gsub(/%(-?[dmyab])/i) { |match| STRFTIME_TO_DATEPICKER[$1] || match }
# => dd/mm/yyyy
puts '%d %-d %a %A %-m %m %b %B %y %Y %M %w'.gsub(/%(-?[dmyab])/i) { |match| STRFTIME_TO_DATEPICKER[$1] || match }
# => dd d D DD m mm M MM yy yyyy %M %w

在JavaScript中:

var convert_ruby_strftime_to_datepicker_format = (function () {
    var format_conversions = {
        '-d': 'd',   // numeric date, no leading zero
        'd' : 'dd',  // numeric date, with leading zero
        'a' : 'D',   // abbreviated weekday name (e.g., Mon)
        'A' : 'DD',  // full weekday name (e.g., Monday)
        '-m': 'm',   // numeric month, no leading zero
        'm' : 'mm',  // numeric month, with leading zero
        'b' : 'M',   // abbreviated month name (e.g., Jan)
        'B' : 'MM',  // full month name (e.g., January)
        'y' : 'yy',  // 2-digit year
        'Y' : 'yyyy' // 4-digit year
    };
    function convert_strftime(match, format) {
        return format_conversions[format] || match;
    }
    return function (strftime) {
        return strftime.replace(/%(-?[dmyab])/gi, convert_strftime);
    };
})();
console.log(convert_ruby_strftime_to_datepicker_format('%d/%m/%Y'));
// dd/mm/yyyy
console.log(convert_ruby_strftime_to_datepicker_format('%d %-d %a %A %-m %m %b %B %y %Y %M %w'));
// dd d D DD m mm M MM yy yyyy %M %w 

已知格式被转换,未知格式被传递。