Source: lib/fields/datetime.js

/*jshint laxcomma: true, smarttabs: true, node: true*/
'use strict';
/**
 * Field class for dealing with Date Time objects
 * @module tastypie/fields/datetime
 * @author Eric Satterwhite
 * @since 0.5.0
 * @requires boom
 * @requires util
 * @requires mout/date/strftime
 * @requires mout/lang/isString
 * @requires tastypie/lib/class
 * @requires tastypie/lib/fields/api
 */

var util           = require( 'util' )
  , boom           = require( 'boom' )
  , strftime       = require( 'mout/date/strftime' )
  , isString       = require( 'mout/lang/isString'  )
  , Class          = require( '../class' )
  , ApiField       = require('./api')
  , DATETIME_REGEX = /^(\d{4})-(\d{2})-(\d{2})(?:T|\s+)(\d{2}):(\d{2}):(\d{2}).*/
  , sample         = new Date('Jan 31, 1960 14:30:00')
  , DateTimeField
  ;

/**
 * @constructor
 * @alias module:tastypie/fields/datetime
 * @extends module:tastypie/fields/api
 * @param {Object} [options]
 * @param {String} [options.format=%Y-%m-%dT%M:%H:%S.%LZ]
 */
 DateTimeField = new Class({
    inherits:ApiField
    ,options:{
        format:'%Y-%m-%dT%H:%M:%S.%LZ'
        ,help:'Converts a Date object to and from YYY-MM-DDTHH:MM:SS'
    }

    ,constructor: function( options ){
      this.parent('constructor', options );
    }
    ,convert: function convert( value ){
      if( value && isString( value ) ){
        var valid = value.match( DATETIME_REGEX );
        if( !valid ){
          this.emit('error', boom.create(400, util.format( "Invalid Date String for field %s: %s", this.options.name, value ) ) );
        }
        return new Date( valid[1], valid[2], valid[3], valid[4], valid[5], valid[ 6]);
      }

      return value;
    }
    ,dehydrate: function( obj, cb ){
      this.parent('dehydrate', obj, ( err, value ) => {
        return cb( err, value ? strftime( value, this.options.format) : value );
      });
    }

    ,hydrate: function( bundle, cb ){
      this.parent('hydrate', bundle, (err, value ) => {
        cb( err , value && this.convert( value ) );
      });
    }

    ,format: function(){
      return strftime( sample, this.options.format );
    }

    ,type: function( ){
      return 'datetime';
    }
});

module.exports = DateTimeField;