Angularjs 如何使用动量Sjs和角度J获得子午线(am/pm)

Angularjs 如何使用动量Sjs和角度J获得子午线(am/pm),angularjs,date,momentjs,Angularjs,Date,Momentjs,我有一个关于library moments.js的问题,我有一个angularjs应用程序,其中我有六个选择元素,分别是年、月、日、小时、分钟和am/pm格式。我使用以下格式时刻构建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 mo

我有一个关于library moments.js的问题,我有一个angularjs应用程序,其中我有六个选择元素,分别是年、月、日、小时、分钟和am/pm格式。我使用以下格式时刻构建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”或“pm”

如果是am或pm,我将构建作为参数传递的数组,如果是am或pm date,我还将从任何日期获取数组。

一些事情:

  • 你要找的词是,不是。这是一个拉丁词,意思是“中午”。上午是“上午前”(中午前),下午是“下午后”(中午后)

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

  • moment中的解析和格式化函数确实有12个小时(
    h
    hh
    )和meridiem(
    A
    A
    )的选项,但您的用例中没有解析或格式化,因此使用它们会有点笨拙。特别是,它们基于moment当前的语言环境设置,因此如果没有将语言环境固定到特定的语言,那么测试字符串就会有问题

  • 您可以使用这些简单的函数将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
        }
    }
    
    要测试这些功能,请执行以下操作:

    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);
      }
    }
    
    功能测试(){
    
    对于(var i=0;i另一个答案非常好。它帮助我创建了我的演示,因为如果没有它,我可能会错过这个月(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)
    。这将返回true或false

    您不希望在select中显示0到11的月份点可以通过
    displayLabel
    函数固定,该函数将增加月份数组的每个值。然后,您将其显示为1到12,但存储为0到11。如果您正在编写指令,则可以通过
    ngModel
    函数更好地处理该指令> 请看一下下面的演示或这个

    angular.module('demoApp',[])
    .filter('momentDate',MomentDateFilter)
    .filter('momentUTC',MomentUTCFilter)
    .控制器(“主控制器”,主控制器);
    函数MomentDateFilter(){
    返回函数(输入,格式){
    返回力矩(输入)。格式(格式);
    };
    }
    函数动量过滤器(){
    返回函数(输入,格式){
    返回时刻。utc(输入)。格式(格式);
    };
    }
    函数MainController($scope,$log){
    var vm=这个,
    现在=时刻();
    vm.checkHour=checkHour;
    vm.dateSelect=dateSelection();
    vm.displayLabel=displayLabel;
    vm.now=now;
    vm.selected={
    “天”:27,
    “月”:8,
    “年份”:2015年,
    “小时”:18,
    “梅里迪姆”:“PM”,
    “分钟”:6,
    “秒”:20
    };
    函数dateSelection(){
    返回{//在每次加载演示页面时生成
    //最好将generate对象存储为json并加载它
    日期:createRange(1,31),
    月份:createRange(0,11),
    年份:createRange(1900、2100),
    小时:createRange(0,24),
    分钟数:createRange(0,59),
    秒:createRange(0,59),
    梅里迪姆:“上午下午”,分开
    };
    }
    函数显示标签(键、值){
    如果(键=='month'){
    value++;//对于正确的月份值1到12,增加月份
    }
    返回值;
    }
    功能检查时间(键,小时){//更新时间(上午/下午)
    如果(键=='hour'){
    var curDate=时刻().小时(小时);
    //log('check hour',hour,curDate.hour(),curDate.localeData());
    vm.selected.meridiem=curDate
    .localeData().meridiem(小时);
    //console.log(curDate
    //.localeData().isPM(vm.selected.meridiem));
    }
    //console.log('changed',key);
    }
    //console.log(this.dateSelect);
    函数createRange(从、到){
    var-arr=[];
    
    对于(i=from;i您还可以执行类似于
    m.format('a')

    的操作,您可以使用以下函数延长时间,并以设置和获取小时、天、分钟等相同的方式使用它

    moment.fn.meridiem=函数(newMeridiem){
    如果(!newMeridiem){
    返回this.format('A');//或`返回this.hours()<12?'AM':'PM'`
    }
    if(newMeridiem.toUpperCase()=='AM'和&this.hours()>12){
    this.hours(this.hours()-12);
    
    }否则,如果(newMeridiem.toUpperCase()==='PM'&&this.hours()以瞬间格式查看文档,则there@charlietfl-事实上,不是。@MattJohnson确定它是
    A
    A
    。@charlietfl-是的,但语言环境会影响这一点。
    矩().format(“A”)==“pm”
    如果(例如)
    矩.locale()=='zh cn'
    。谢谢,你的解决方案对我非常有用。谢谢你的帮助,Matt的解决方案和你的解决方案对我很有效。