简体   繁体   English

将字符串转换为格式化日期

[英]Converting a string into a formatted date

I have written JavaScript code that reads text fields named leave_start and leave_end and determines the dates that fall between them. 我已经编写了JavaScript代码,该代码读取名为leave_startleave_end文本字段,并确定它们之间的日期。 Currently, the dates I am creating look like this: 目前,我创建的日期如下所示:

Mon Apr 6 2015 00:00:00 GMT-0400

However, I want each date to instead look like this: 但是,我希望每个日期看起来像这样:

Mon Apr 6 2015

As you can see, I simply want to strip off the time component. 如您所见,我只是想剥离时间部分。 Can anyone help? 有人可以帮忙吗?


Framework: Ruby on rails 4.1.8 框架: Ruby on Rails 4.1.8

This is my app.js that looks at my two datepicker text fields ( leave_start and leave_end ). 这是我的app.js看起来在我的两个datepicker的文本字段( leave_startleave_end )。

$(document).ready(function () {

    $('.customSub').click(function () {

        var start = $('#leave_start').datepicker("getDate"),
            end = $('#leave_end').datepicker("getDate"),
            currentDate = new Date(start),
            between = [];

        while (currentDate <= end) {
            between.push(new Date(currentDate));
            currentDate.setDate(currentDate.getDate() + 1);
        }

        var formated_dates = between.reduce(function (dates, date) {
            dates.push(date.toString());
            return dates;
        }, []);
        $('#gdates').val(formated_dates.join("\n"));

    });
});

Based off the answer by @Nikos M., would this be the correct way of doing it? 根据@Nikos M.的回答,这是否是正确的方法?

$(document).ready(function() {

    $('.customSub').click(function() {

        var start = $('#leave_start').datepicker("getDate"),
            end = $('#leave_end').datepicker("getDate"),
            currentDate = new Date(start),
            between = []
        ;

        while (currentDate <= end) {
            between.push(new Date(currentDate));
            currentDate.setDate(currentDate.getDate() + 1);
        }
        var date_start = new Date();
        console.log(date('Y-m-d', date_start));

        var formated_dates = between.reduce(function(dates, date){
            dates.push(date.toString());
            return dates;
        }, []);
        $('#gdates').val(formated_dates.join("\n"));

    });
  });

Additional information 附加信息

This is my index view where I would like full_range to look like Mon Apr 6 2015 instead of Mon Apr 6 2015 00:00:00 GMT-0400 . 这是我的索引视图,我希望full_range看起来像Mon Apr 6 2015而不是Mon Apr 6 2015 00:00:00 GMT-0400 I tried using .strftime('%m/%d/%y') on full_range but it didn't work. 我试着用.strftime('%m/%d/%y')full_range ,但没有奏效。 full_range is #gdates in my JavaScript. full_range在我的JavaScript中是#gdates

 %table.table.table-bordered.trace-table
   %tr
   -@entry.each do |e|
     %tr
       %td.trace-table.bordered.trace-table{:style => 'width:8%;'}= e.leave_start.strftime('%m/%d/%y')
       %td.trace-table.bordered.trace-table{:style => 'width:8%;'}= e.leave_end.strftime('%m/%d/%y')
       %td.trace-table.bordered.trace-table{:style => 'width:8%;'}= e.full_range

Finally, this is my entry table: 最后,这是我的输入表:

create_table "entries"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.datetime "leave_start"
  t.datetime "leave_end"
    t.string "full_range"

to_date() public Converts a string to a Date value. to_date()public将字符串转换为Date值。

> "1-1-2012".to_date   # => Sun, 01 Jan 2012
> "01/01/2012".to_date # => Sun, 01 Jan 2012
> "2012-12-13".to_date # => Thu, 13 Dec 2012

Source : http://apidock.com/rails/String/to_date 资料来源: http : //apidock.com/rails/String/to_date

There are varioius libraries around for manipulating dates in various formats like moment.js etc 周围有varioius库,用于处理各种格式的日期,例如moment.js等。

What you need here is a function to convert the date into a given format. 您需要的是一个将日期转换成给定格式的函数。 Javascript already has a limited such feature by using date.toString or date.toDate 通过使用date.toStringdate.toDate Javascript已经具有有限的此类功能

PHP has a function to format date which has been ported to javascript on php.js project (on github) you can literaly use that function in your project (simply copy-paste it as it is standalone) PHP具有格式化日期的功能,该功能已移植到php.js项目(在github上)上的javascript中,您可以在项目中直接使用该功能(只需复制粘贴即可,因为它是独立的)

PHP date format PHP日期格式

You can literaly format the date as you need including time, year etc.. (it is not limited as the js native date methods) 您可以根据需要格式化日期格式,包括时间,年份等。(不限于js本机日期方法)

reproducing code here (taken from php.js): 在此处复制代码(取自php.js):

function date(format, timestamp) {
  //  discuss at: http://phpjs.org/functions/date/
  // original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
  // original by: gettimeofday
  //    parts by: Peter-Paul Koch (http://www.quirksmode.org/js/beat.html)
  // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // improved by: MeEtc (http://yass.meetcweb.com)
  // improved by: Brad Touesnard
  // improved by: Tim Wiel
  // improved by: Bryan Elliott
  // improved by: David Randall
  // improved by: Theriault
  // improved by: Theriault
  // improved by: Brett Zamir (http://brett-zamir.me)
  // improved by: Theriault
  // improved by: Thomas Beaucourt (http://www.webapp.fr)
  // improved by: JT
  // improved by: Theriault
  // improved by: Rafał Kukawski (http://blog.kukawski.pl)
  // improved by: Theriault
  //    input by: Brett Zamir (http://brett-zamir.me)
  //    input by: majak
  //    input by: Alex
  //    input by: Martin
  //    input by: Alex Wilson
  //    input by: Haravikk
  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // bugfixed by: majak
  // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // bugfixed by: Brett Zamir (http://brett-zamir.me)
  // bugfixed by: omid (http://phpjs.org/functions/380:380#comment_137122)
  // bugfixed by: Chris (http://www.devotis.nl/)
  //        note: Uses global: php_js to store the default timezone
  //        note: Although the function potentially allows timezone info (see notes), it currently does not set
  //        note: per a timezone specified by date_default_timezone_set(). Implementers might use
  //        note: this.php_js.currentTimezoneOffset and this.php_js.currentTimezoneDST set by that function
  //        note: in order to adjust the dates in this function (or our other date functions!) accordingly
  //   example 1: date('H:m:s \\m \\i\\s \\m\\o\\n\\t\\h', 1062402400);
  //   returns 1: '09:09:40 m is month'
  //   example 2: date('F j, Y, g:i a', 1062462400);
  //   returns 2: 'September 2, 2003, 2:26 am'
  //   example 3: date('Y W o', 1062462400);
  //   returns 3: '2003 36 2003'
  //   example 4: x = date('Y m d', (new Date()).getTime()/1000);
  //   example 4: (x+'').length == 10 // 2009 01 09
  //   returns 4: true
  //   example 5: date('W', 1104534000);
  //   returns 5: '53'
  //   example 6: date('B t', 1104534000);
  //   returns 6: '999 31'
  //   example 7: date('W U', 1293750000.82); // 2010-12-31
  //   returns 7: '52 1293750000'
  //   example 8: date('W', 1293836400); // 2011-01-01
  //   returns 8: '52'
  //   example 9: date('W Y-m-d', 1293974054); // 2011-01-02
  //   returns 9: '52 2011-01-02'

  var that = this;
  var jsdate, f;
  // Keep this here (works, but for code commented-out below for file size reasons)
  // var tal= [];
  var txt_words = [
    'Sun', 'Mon', 'Tues', 'Wednes', 'Thurs', 'Fri', 'Satur',
    'January', 'February', 'March', 'April', 'May', 'June',
    'July', 'August', 'September', 'October', 'November', 'December'
  ];
  // trailing backslash -> (dropped)
  // a backslash followed by any character (including backslash) -> the character
  // empty string -> empty string
  var formatChr = /\\?(.?)/gi;
  var formatChrCb = function (t, s) {
    return f[t] ? f[t]() : s;
  };
  var _pad = function (n, c) {
    n = String(n);
    while (n.length < c) {
      n = '0' + n;
    }
    return n;
  };
  f = {
    // Day
    d: function () {
      // Day of month w/leading 0; 01..31
      return _pad(f.j(), 2);
    },
    D: function () {
      // Shorthand day name; Mon...Sun
      return f.l()
        .slice(0, 3);
    },
    j: function () {
      // Day of month; 1..31
      return jsdate.getDate();
    },
    l: function () {
      // Full day name; Monday...Sunday
      return txt_words[f.w()] + 'day';
    },
    N: function () {
      // ISO-8601 day of week; 1[Mon]..7[Sun]
      return f.w() || 7;
    },
    S: function () {
      // Ordinal suffix for day of month; st, nd, rd, th
      var j = f.j();
      var i = j % 10;
      if (i <= 3 && parseInt((j % 100) / 10, 10) == 1) {
        i = 0;
      }
      return ['st', 'nd', 'rd'][i - 1] || 'th';
    },
    w: function () {
      // Day of week; 0[Sun]..6[Sat]
      return jsdate.getDay();
    },
    z: function () {
      // Day of year; 0..365
      var a = new Date(f.Y(), f.n() - 1, f.j());
      var b = new Date(f.Y(), 0, 1);
      return Math.round((a - b) / 864e5);
    },

    // Week
    W: function () {
      // ISO-8601 week number
      var a = new Date(f.Y(), f.n() - 1, f.j() - f.N() + 3);
      var b = new Date(a.getFullYear(), 0, 4);
      return _pad(1 + Math.round((a - b) / 864e5 / 7), 2);
    },

    // Month
    F: function () {
      // Full month name; January...December
      return txt_words[6 + f.n()];
    },
    m: function () {
      // Month w/leading 0; 01...12
      return _pad(f.n(), 2);
    },
    M: function () {
      // Shorthand month name; Jan...Dec
      return f.F()
        .slice(0, 3);
    },
    n: function () {
      // Month; 1...12
      return jsdate.getMonth() + 1;
    },
    t: function () {
      // Days in month; 28...31
      return (new Date(f.Y(), f.n(), 0))
        .getDate();
    },

    // Year
    L: function () {
      // Is leap year?; 0 or 1
      var j = f.Y();
      return j % 4 === 0 & j % 100 !== 0 | j % 400 === 0;
    },
    o: function () {
      // ISO-8601 year
      var n = f.n();
      var W = f.W();
      var Y = f.Y();
      return Y + (n === 12 && W < 9 ? 1 : n === 1 && W > 9 ? -1 : 0);
    },
    Y: function () {
      // Full year; e.g. 1980...2010
      return jsdate.getFullYear();
    },
    y: function () {
      // Last two digits of year; 00...99
      return f.Y()
        .toString()
        .slice(-2);
    },

    // Time
    a: function () {
      // am or pm
      return jsdate.getHours() > 11 ? 'pm' : 'am';
    },
    A: function () {
      // AM or PM
      return f.a()
        .toUpperCase();
    },
    B: function () {
      // Swatch Internet time; 000..999
      var H = jsdate.getUTCHours() * 36e2;
      // Hours
      var i = jsdate.getUTCMinutes() * 60;
      // Minutes
      // Seconds
      var s = jsdate.getUTCSeconds();
      return _pad(Math.floor((H + i + s + 36e2) / 86.4) % 1e3, 3);
    },
    g: function () {
      // 12-Hours; 1..12
      return f.G() % 12 || 12;
    },
    G: function () {
      // 24-Hours; 0..23
      return jsdate.getHours();
    },
    h: function () {
      // 12-Hours w/leading 0; 01..12
      return _pad(f.g(), 2);
    },
    H: function () {
      // 24-Hours w/leading 0; 00..23
      return _pad(f.G(), 2);
    },
    i: function () {
      // Minutes w/leading 0; 00..59
      return _pad(jsdate.getMinutes(), 2);
    },
    s: function () {
      // Seconds w/leading 0; 00..59
      return _pad(jsdate.getSeconds(), 2);
    },
    u: function () {
      // Microseconds; 000000-999000
      return _pad(jsdate.getMilliseconds() * 1000, 6);
    },

    // Timezone
    e: function () {
      // Timezone identifier; e.g. Atlantic/Azores, ...
      // The following works, but requires inclusion of the very large
      // timezone_abbreviations_list() function.
      /*              return that.date_default_timezone_get();
       */
      throw 'Not supported (see source code of date() for timezone on how to add support)';
    },
    I: function () {
      // DST observed?; 0 or 1
      // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC.
      // If they are not equal, then DST is observed.
      var a = new Date(f.Y(), 0);
      // Jan 1
      var c = Date.UTC(f.Y(), 0);
      // Jan 1 UTC
      var b = new Date(f.Y(), 6);
      // Jul 1
      // Jul 1 UTC
      var d = Date.UTC(f.Y(), 6);
      return ((a - c) !== (b - d)) ? 1 : 0;
    },
    O: function () {
      // Difference to GMT in hour format; e.g. +0200
      var tzo = jsdate.getTimezoneOffset();
      var a = Math.abs(tzo);
      return (tzo > 0 ? '-' : '+') + _pad(Math.floor(a / 60) * 100 + a % 60, 4);
    },
    P: function () {
      // Difference to GMT w/colon; e.g. +02:00
      var O = f.O();
      return (O.substr(0, 3) + ':' + O.substr(3, 2));
    },
    T: function () {
      // Timezone abbreviation; e.g. EST, MDT, ...
      // The following works, but requires inclusion of the very
      // large timezone_abbreviations_list() function.
      /*              var abbr, i, os, _default;
      if (!tal.length) {
        tal = that.timezone_abbreviations_list();
      }
      if (that.php_js && that.php_js.default_timezone) {
        _default = that.php_js.default_timezone;
        for (abbr in tal) {
          for (i = 0; i < tal[abbr].length; i++) {
            if (tal[abbr][i].timezone_id === _default) {
              return abbr.toUpperCase();
            }
          }
        }
      }
      for (abbr in tal) {
        for (i = 0; i < tal[abbr].length; i++) {
          os = -jsdate.getTimezoneOffset() * 60;
          if (tal[abbr][i].offset === os) {
            return abbr.toUpperCase();
          }
        }
      }
      */
      return 'UTC';
    },
    Z: function () {
      // Timezone offset in seconds (-43200...50400)
      return -jsdate.getTimezoneOffset() * 60;
    },

    // Full Date/Time
    c: function () {
      // ISO-8601 date.
      return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb);
    },
    r: function () {
      // RFC 2822
      return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb);
    },
    U: function () {
      // Seconds since UNIX epoch
      return jsdate / 1000 | 0;
    }
  };
  this.date = function (format, timestamp) {
    that = this;
    jsdate = (timestamp === undefined ? new Date() : // Not provided
      (timestamp instanceof Date) ? new Date(timestamp) : // JS Date()
      new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int)
    );
    return format.replace(formatChr, formatChrCb);
  };
  return this.date(format, timestamp);
}

use as such: 这样使用:

var date_start = new Date();
/* use any format you like here */
console.log(date('Y-m-d', Math.floor(date_start.getTime() / 1000)));
// or even this
console.log(date('Y-m-d', date_start));

output: 输出:

2015-05-08

d = new Date will return << Wed Apr 08 2015 18:45:45 GMT+0530 (IST) d =新日期将返回<< 2015年4月8日星期三18:45:45 GMT + 0530(IST)

d.toDateString will return << "Wed Apr 08 2015" d.toDateString将返回<<“ 2015年4月8日”

try this in rails c 在rails c中尝试一下

d = DateTime.now d = DateTime.now

d.to_date d.to_date

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM