2015-09-26 5 views
5

मेरे पास लाइब्रेरी क्षणों के बारे में कोई प्रश्न है। Js, मेरे पास कोणीय में एक एप्लिकेशन है जहां मेरे पास वर्ष, महीने, दिन, घंटे के लिए छह चुनिंदा तत्व हैं, मिनट, और am/pm प्रारूप। मैं m.format दिनांक बनाने के लिए निम्न प्रारूप पल का उपयोग कर रहा हूं ('YYYY-MM-DD hh: mm: ss a)।momentsjs और angularjs के साथ मेरिडियन (am/pm) कैसे प्राप्त करें

var m = moment([scope.val.year, scope.val.month, scope.val.date, scope.val.hour, scope.val.minute]); //build date 

model.$setViewValue(m.format('YYYY-MM-DD hh:mm:ss a')) 

मैं डेटा m.hour(), m.minute() मिलता है, आदि लेकिन वहाँ एक रास्ता AM/PM प्रारूप प्राप्त करने के लिए है, मैं नहीं इसके बारे में कुछ है, शायद के रूप में मिल गया है कुछ:

कोड इस प्रकार है m.meridian() => "am "or" pm "

मैं सरणी या पैरामीटर के रूप में पैरामीटर के रूप में गुजरने वाली सरणी का निर्माण करूंगा, और फिर अगर किसी भी तारीख से या शाम की तारीख से भी प्राप्त होगा।

+2

नज़र कुछ वहाँ – charlietfl

+0

@charlietfl कर सकता है ... यह है - वास्तव में, कोई यह नहीं है। –

+0

@MattJohnson यकीन है कि यह 'ए' या' ए' है ... http://momentjs.com/docs/#/displaying/ – charlietfl

उत्तर

6

कुछ बातें:

  • शब्द आप देख रहे हैं "meridiem", नहीं "meridian" है। यह एक लैटिन शब्द है जिसका अर्थ है "मध्य-दिन"। मध्याह्न तक "एंटी मेरिडिम" (मध्य-दिन से पहले) और पीएम है। "पोस्ट मेरिडिम" है (मध्य-दिन के बाद)।

  • .hours() समारोह और इनपुट सरणी moment निर्माता दोनों एक 24-घंटे घड़ी के घंटे की उम्मीद पारित कर दिया, 0 से 23 के लिए वहाँ, कोई निर्मित समारोह को स्वीकार करने या उत्पादन एक 12-घंटे घड़ी मूल्य है या एक मेरिडिम (हूँ/अपराह्न)।

  • पल में पार्स करने और स्वरूपण कार्यों 12-घंटे घड़ी घंटे के लिए विकल्प (h या hh) और दोपहर (A या a) की क्या ज़रूरत है, लेकिन आप को पार्स या आपके उपयोग के मामले में प्रारूपित नहीं कर रहे हैं, ताकि वे उपयोग करने के लिए थोड़ा बेकार हो। विशेष रूप से, वे पल की वर्तमान लोकेल सेटिंग्स पर आधारित होते हैं, इसलिए एक स्ट्रिंग का परीक्षण करना समस्याग्रस्त हो जाएगा यदि लोकेल को किसी विशिष्ट भाषा में तय नहीं किया गया हो।

  • आप 12-घंटे + मेरिडियम से 24 घंटे तक और इसके विपरीत में बदलने के लिए इन सरल कार्यों का उपयोग कर सकते हैं। वे पल के लिए विशिष्ट नहीं हैं, इसलिए आप उन्हें Date ऑब्जेक्ट या अन्य जगहों के साथ भी उपयोग कर सकते हैं।

    function hours12to24(h, pm) { 
        return h == 12 ? pm ? 12 : 0 : pm ? h + 12 : h; 
    } 
    
    function hours24to12(h) { 
        return { 
         hour : (h + 11) % 12 + 1, 
         pm : h >= 12 
        } 
    } 
    

    इन कार्यों का परीक्षण करने के लिए: जब .month() बुला महीने संख्या प्राप्त करने

    function test() { 
        for (var i = 0; i <= 23; i++) { 
        var x = hours24to12(i); 
        var h = hours12to24(x.hour, x.pm); 
        console.log(i + " == " + x.hour + (x.pm ? " pm" : " am") + " == " + h); 
        } 
    } 
    
  • इसके अलावा, सावधान रहना, परिणाम 0-11, 1-12 नहीं कर रहे हैं। इनपुट सरणी बनाते समय भी यही सच है। आपके ड्रॉपडाउन को या तो 0-11 का उपयोग करने की आवश्यकता है, या आपको तदनुसार 1 जोड़ना या घटाना होगा।

+0

धन्यवाद, यह आपके समाधान के लिए बहुत उपयोगी था। – ojedawinder

1

दूसरा उत्तर बहुत अच्छा है। इससे मुझे अपना डेमो बनाने में मदद मिली क्योंकि इसके साथ-साथ मैं इस महीने (0 से 11) के साथ बिंदु को चूक गया होता।

लेकिन आपको मेरिडिम फ़ंक्शन बनाने की आवश्यकता नहीं है क्योंकि यह पहले ही moment.js में लागू हो चुकी है। मुद्दा यह है कि उपयोग दस्तावेज़ों से बहुत स्पष्ट नहीं है।आप एक बूलियन बजाय AM/PM स्ट्रिंग की आप curDate.localeData().isPM(meridiem) लिए AM/PM स्ट्रिंग पारित कर सकते हैं की जरूरत है

var curDate = moment().hour(yourHour); // create a moment date with the hour you'd like to test 
var meridiem = curDate 
      .localeData().meridiem(hour); // will return AM/PM String 

:

आप meridiem समारोह इस तरह उपयोग कर सकते हैं। वह सच या गलत वापस आ जाएगा।

उस महीने के साथ बिंदु जिसे आप अपने चयन में 0 से 11 प्रदर्शित नहीं करना चाहते हैं, displayLabel फ़ंक्शन द्वारा तय किया जा सकता है जो महीने सरणी के प्रत्येक मूल्य को बढ़ाएगा। फिर आप इसे 1 से 12 प्रदर्शित करेंगे लेकिन 0 से 11 के रूप में संग्रहीत होंगे। यदि आप एक निर्देश लिख रहे हैं जिसे ngModel के फ़ंक्शन द्वारा बेहतर तरीके से संभाला जा सकता है।

कृपया नीचे दिए गए डेमो पर या jsfiddle पर एक नज़र डालें।

angular.module('demoApp', []) 
 
\t .filter('momentDate', MomentDateFilter) 
 
\t .filter('momentUTC', MomentUTCFilter) 
 
\t .controller('MainController', MainController); 
 

 
function MomentDateFilter() { 
 
\t return function(input, format) { 
 
     return moment(input).format(format); 
 
    }; 
 
} 
 

 
function MomentUTCFilter() { 
 
\t return function(input, format) { 
 
     return moment.utc(input).format(format); 
 
    }; 
 
} 
 

 
function MainController($scope, $log) { 
 
    var vm = this, 
 
     now = moment(); 
 
    
 
    vm.checkHour = checkHour; 
 
    vm.dateSelect = dateSelection(); 
 
    vm.displayLabel = displayLabel; 
 
    vm.now = now; 
 
    vm.selected = { 
 
     "day": 27, 
 
     "month": 8, 
 
     "year": 2015, 
 
     "hour": 18, 
 
     "meridiem": "PM", 
 
     "minutes": 6, 
 
     "seconds": 20 
 
    }; 
 
    
 
    function dateSelection() { 
 
     return { // generated on every page load for demo 
 
      \t // better store the generate object as json and load it 
 
      day: createRange(1,31), 
 
      month: createRange(0,11), 
 
      year: createRange(1900, 2100), 
 
      hour: createRange(0,24), 
 
      minutes: createRange(0,59), 
 
      seconds: createRange(0,59), 
 
      meridiem: 'AM_PM'.split('_') 
 
     }; 
 
\t } 
 
    
 
    function displayLabel(key, value) { 
 
    \t if (key === 'month') { 
 
     \t value++; // increment month for correct month value 1 to 12 
 
     } 
 
     return value; 
 
    } 
 
    
 
    function checkHour(key, hour) { // updates meridiem (AM/PM) 
 
     if (key === 'hour') { 
 
      var curDate = moment().hour(hour); 
 
      //console.log('check hour', hour, curDate.hour(), curDate.localeData()); 
 
      vm.selected.meridiem = curDate 
 
       .localeData().meridiem(hour); 
 
      //console.log(curDate 
 
      // .localeData().isPM(vm.selected.meridiem)); 
 
     } 
 
     //console.log('changed', key); 
 
    } 
 
    //console.log(this.dateSelect); 
 
    function createRange(from, to) { 
 
     var arr = []; 
 
    \t for(i=from; i<=to; i++) { 
 
     \t arr.push(i); 
 
     } 
 
     //console.log(arr); 
 
     return arr; 
 
    } 
 
    
 
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.0/angular.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.js"></script> 
 
<div ng-app="demoApp" ng-controller="MainController as mainCtrl" class="container-fluid"> 
 
    <form class="form-inline"> 
 
     <div ng-repeat="(key, array) in mainCtrl.dateSelect" class="form-group"> 
 
      <label>{{key}}</label><select class="form-control" ng-change="mainCtrl.checkHour(key, array[mainCtrl.selected[key]])" ng-model="mainCtrl.selected[key]" ng-options="value as mainCtrl.displayLabel(key, value) for value in mainCtrl.dateSelect[key]" ng-disabled="key === 'meridiem'"> 
 
      </select> 
 
     </div> 
 
    </form> 
 
    selected: <pre>{{mainCtrl.selected|json}}</pre> 
 
    raw date (unformatted, UTC): {{mainCtrl.selected | momentUTC}}<br/> 
 
    date formatted (meridiem locale): {{mainCtrl.selected | momentUTC : 'LLLL' }}<br/> 
 
    
 
    
 
    now (momentjs) {{mainCtrl.now}} 
 
</div>

+0

आपकी मदद के लिए धन्यवाद, मैट का समाधान और आपके समाधान ने मेरे लिए काम किया। – ojedawinder

6

तुम भी तरह पल प्रारूप डॉक्स में m.format('a')

संबंधित मुद्दे