我对库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,也可以从任何日期获取。
答案 0 :(得分:8)
您也可以执行m.format('a')
答案 1 :(得分:7)
一些事情:
您要找的字是"meridiem",而不是"meridian"。它是一个拉丁词,意思是"中午"。上午。是" ante meridiem" (中午之前)和P.M.是"发布meridiem" (中午之后)。
.hours()
函数和传递给moment
构造函数的输入数组都需要24小时制的小时数,从0到23.没有内置函数可以接受或者输出12小时制的时钟值,或者输出meridiem(am / pm)。
片刻中的解析和格式化功能可以选择12小时制(h
或hh
)和meridiem(A
或a
) ,但是你没有在你的用例中解析或格式化,所以使用它们会有些笨拙。特别是,它们基于时刻的当前语言环境设置,因此如果语言环境没有固定为特定语言,则测试字符串会有问题。
您可以使用这些简单的功能将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>