我正在尝试创建自定义发布日期,因为用户希望将其用作发布日期并进行排序。日期也将显示在页面上。
这是我想要的:
- 用户可以输入日期
- 日期可以为空(表示它将立即发布)
- 它必须使用该日期进行排序
- 日期必须设置为 UTC 时间,因此世界上每个人都是平等的
我很绝望,我不知道该怎么做。
这是我到目前为止尝试过的:我找到了一个简洁的小插件,它在输入字段旁边显示用户的当前 UTC 时间,因此该人知道他们的 UTC 时间。我修改了它以始终在输入字段中输入当前日期:
var timer = setInterval(function () {
var date = $(".custom-date").val();
if (date === "") {
$(".custom-date").focus();
$(".custom-date").click();
$(".custom-date").trigger("click");
//the date has now been set on the input field
} else if (date !== "") {
var newDate = new Date(date);
var stringDate = newDate.getFullYear() + "-" + ('0' + (newDate.getMonth() + 1)).slice(-2) + "-" + ('0' + (newDate.getDate() - 1)).slice(-2) + " " + ('0' + (newDate.getHours() - offset)).slice(-2) + ":" + ('0' + newDate.getMinutes()).slice(-2) + ":" + ('0' + newDate.getSeconds()).slice(-2);
$(".custom-date").val(stringDate);
angular.element(".custom-date").scope().$apply(function () {
angular.element(".custom-date").scope().datetimePickerValue = stringDate;
});
clearInterval(timer);
}
}, 1000);
是的,这看起来很多...不,它不起作用。我在元素上做焦点/单击/触发器,因为这会自动将时间设置为用户的本地时间。然后我将其转换为 UTC 时间(偏移量是 UTC 时间偏移量)。然后我将日期应用于元素的范围,值在$scope和视图中都会更新(我实际上可以看到它)。
但是,当我点击保存并发布时,日期被重置(它在数据库中为空)。只有当我物理单击输入字段并选择新日期时,它才会实际更新它。我喜欢这种方法,因为我可以 100% 控制它,所以可能吗?似乎在范围上设置新日期不会触发实际的"已选择新日期"。
或者,我这里有我的剃刀代码:
//selection is all my elements/nodes
selection.OrderByDescending(x => x.GetProperty("publishDate") != null).ThenByDescending(x => x.GetPropertyValue("publishDate")).Where(x => x.GetPropertyValue<DateTime>("publishDate") < DateTime.UtcNow);
所以显然在触发 Angular 事件之前,我至少需要调用这些:
$(".custom-date").trigger("click");
$(".custom-date").change();
所以我在设定新日期后立即这样做了,现在它可以工作了。