如何使用momentjs和angularjs获得子午线(上午/下午)

时间:2015-09-26 22:46:24

标签: angularjs date momentjs

我对库moment.js有一个问题,我在angularjs中有一个应用程序,我有六个选择元素,分别为年,月,日,小时,分钟和上午/下午格式。我使用以下格式时刻来构建m.format日期('YYYY-MM-DD hh:mm:ss a)。

代码如下:

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 "

如果是am或pm,我会构建作为参数传递的数组,然后如果是am或pm date,也可以从任何日期获取。

4 个答案:

答案 0 :(得分:8)

您也可以执行m.format('a')

之类的操作

答案 1 :(得分:7)

一些事情:

  • 您要找的字是"meridiem",而不是"meridian"。它是一个拉丁词,意思是"中午"。上午。是" ante meridiem" (中午之前)​​和P.M.是"发布meridiem" (中午之后)。

  • .hours()函数和传递给moment构造函数的输入数组都需要24小时制的小时数,从0到23.没有内置函数可以接受或者输出12小时制的时钟值,或者输出meridiem(am / pm)。

  • 片刻中的解析和格式化功能可以选择12小时制(hhh)和meridiem(Aa) ,但是你没有在你的用例中解析或格式化,所以使用它们会有些笨拙。特别是,它们基于时刻的当前语言环境设置,因此如果语言环境没有固定为特定语言,则测试字符串会有问题。

  • 您可以使用这些简单的功能将12小时+ meridiem转换为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
        }
    }
    

    测试这些功能:

    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);
      }
    }
    
  • 另外,在致电.month()获取月份数时要小心,结果是0-11,而不是1-12。构建输入数组时也是如此。您的下拉列表需要使用0-11,或者您需要相应地添加或减去1.

答案 2 :(得分:1)

另一个答案非常好。它帮助我创建了我的演示,因为没有它我会错过了月份(0到11)的点。

但是你不需要创建meridiem函数,因为它已经在moment.js中实现了。关键是文档中的用法不是很清楚。

您可以使用meridiem这样的功能:

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

如果您需要布尔值而不是AM/PM字符串,则可以将AM / PM字符串传递给curDate.localeData().isPM(meridiem)。这将返回真或假。

您不希望在选择中显示0到11的月份的点可由displayLabel函数修复,该函数将递增月份数组的每个值。然后你将它显示为1到12但存储为0到11.如果你正在编写一个可以由ngModel angular.module('demoApp', []) .filter('momentDate', MomentDateFilter) .filter('momentUTC', MomentUTCFilter) .controller('MainController', MainController); function MomentDateFilter() { return function(input, format) { return moment(input).format(format); }; } function MomentUTCFilter() { 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 // 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('_') }; } function displayLabel(key, value) { if (key === 'month') { 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 = []; for(i=from; i<=to; i++) { arr.push(i); } //console.log(arr); return arr; } }函数更好地处理的指令。

请查看下面的演示或$parser / $formatter

<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>
strtolower

答案 3 :(得分:0)

您可以使用以下功能来延长时间,并以与设置小时,天,分钟等相同的方式使用它。

moment.fn.meridiem = function(newMeridiem) {
  if (!newMeridiem) {
    return this.format('A'); // or `return this.hours() < 12 ? 'AM' : 'PM';`
  }
  if (newMeridiem.toUpperCase() === 'AM' && this.hours() > 12) {
    this.hours(this.hours() - 12);
  } else if (newMeridiem.toUpperCase() === 'PM' && this.hours() <= 12) {
    this.hours(this.hours() + 12);
  }
  return this;
}

console.log("Current:",moment().meridiem());

console.log("Set as am result:",moment().meridiem('am').meridiem());

console.log("Set as pm result:",moment().meridiem('pm').meridiem());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.26.0/moment.min.js"></script>

https://github.com/moment/moment/issues/3873复制