Angularjs 如何使用动量Sjs和角度J获得子午线(am/pm)
我有一个关于library moments.js的问题,我有一个angularjs应用程序,其中我有六个选择元素,分别是年、月、日、小时、分钟和am/pm格式。我使用以下格式时刻构建m.format日期('YYYY-MM-DD hh:MM:ss a) 代码如下: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
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
)和meridiem(hh
或A
)的选项,但您的用例中没有解析或格式化,因此使用它们会有点笨拙。特别是,它们基于moment当前的语言环境设置,因此如果没有将语言环境固定到特定的语言,那么测试字符串就会有问题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 } }
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
。这将返回true或false 您不希望在select中显示0到11的月份点可以通过curDate.localeData().isPM(meridiem)
函数固定,该函数将增加月份数组的每个值。然后,您将其显示为1到12,但存储为0到11。如果您正在编写指令,则可以通过displayLabel
函数更好地处理该指令> 请看一下下面的演示或这个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
。@charlietfl-是的,但语言环境会影响这一点。A
如果(例如)矩().format(“A”)==“pm”
。谢谢,你的解决方案对我非常有用。谢谢你的帮助,Matt的解决方案和你的解决方案对我很有效。矩.locale()=='zh cn'