我想要检索用户使用bootstrap datepicker输入的两个日期之间的月份差异。除此之外,我还尝试将第二个值(date2)替换为用户单击“计算”按钮时的月份差异。在尝试处理此问题时,我的代码似乎无法正常工作......
这是我到目前为止所做的:
[self startLoading];
NSMutableArray *failedContainerRequests = [NSMutableArray new];
MyContainersViewController __weak *weakSelf = self;
[[RuzaServerAPI newAPIObject] serverGetListOfContainersWithSuccess:^(NSArray *containers) {
dispatch_group_t downloadGroup = dispatch_group_create();
for (RZContainerModel *containerModel in containers) {
NSLog(@"Start container %@ with id %@", containerModel.containerName, containerModel.containerID);
dispatch_group_enter(downloadGroup);
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[[RuzaServerAPI newAPIObject] serverGetListOfProductsInContainer:containerModel.containerID withSuccess:^(NSArray *products) {
if (products.count > 0) {
containerModel.products = [NSMutableArray arrayWithArray:products];
NSMutableArray *imagesURLs = [NSMutableArray new];
for (RZProductModel *productModel in products) {
if (productModel.frontImageUrl) {
[imagesURLs addObject:productModel.frontImageUrl];
}
if (productModel.backImageUrl) {
[imagesURLs addObject:productModel.backImageUrl];
}
}
[self addImagesToDownloadQueue:imagesURLs.copy withComplection:^(BOOL status) {
[[RZCoreDataManager sharedInstance] saveContainer:containerModel withCompletion:^(BOOL success) {
NSLog(@"Container %@ succesfully saved!", containerModel.containerName);
dispatch_semaphore_signal(semaphore);
dispatch_group_leave(downloadGroup);
}];
}];
} else {
[[RZCoreDataManager sharedInstance] saveContainer:containerModel withCompletion:^(BOOL success) {
NSLog(@"Container %@ succesfully saved!", containerModel.containerName);
dispatch_semaphore_signal(semaphore);
dispatch_group_leave(downloadGroup);
}];
}
} failure:^(NSError *error) {
NSLog(@"Container %@ failed!\n%@", containerModel.containerName, error.localizedDescription);
[failedContainerRequests addObject:containerModel];
dispatch_semaphore_signal(semaphore);
dispatch_group_leave(downloadGroup);
// dispatch_async(dispatch_get_main_queue(), ^{
// // Error message!
// });
}];
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
}
dispatch_group_notify(downloadGroup, dispatch_get_main_queue(),^{
[weakSelf stopLoading];
for (RZContainerModel *containerModel in failedContainerRequests) {
NSLog(@"Container %@", containerModel.containerName);
}
});
} failure:^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf stopLoading];
NSString *messageStr = [NSString stringWithFormat:@"%@\nПопробовать еще раз?", error.localizedDescription];
LGAlertView *allert = [[LGAlertView alloc] initWithTitle:@"Ошибка"
message:messageStr
style:LGAlertViewStyleAlert
buttonTitles:@[ @"ОК" ]
cancelButtonTitle:@"Отмена"
destructiveButtonTitle:nil
actionHandler:^(LGAlertView *alertView, NSString *title, NSUInteger index) {
[weakSelf getListOfContainers];
}
cancelHandler:nil
destructiveHandler:nil];
[allert showAnimated:YES completionHandler:nil];
});
}];
以下是我想要完成的图片演示:
我试图区分这两个条目(到期日 - 第一个付款日期)
我试图在用户点击“计算”按钮后进行计算,将月份差异替换为在到期日输入的值。
任何帮助将不胜感激!
答案 0 :(得分:4)
人类日历不利于简单的数学运算 - 幸运的是,javascript提供了一个Date对象,可以为我们完成大部分的脏工作。
这会将日期字符串转换为Date对象(使用输入字段的内容来掩盖任何格式或验证问题。请注意,在您的特定情况下,您打算将#loanTrm
的值替换为数字几个月而不是一个日期,如果用户点击“计算”两次,这将会中断;纠正这更多是用户界面问题而不是编码问题所以我暂时忽略它:)
var date1 = new Date($('#firstPayDate').val());
var date2 = new Date($('#loanTrm').val());
var datediff = date2 - date1;
(正如下面的评论中所指出的那样,请注意Date使用用户的语言环境来确定预期的日期格式:如果您总是以mm / dd / yy显示日期,那么,您可能不应该这样做,因为世界上大部分时间都使用dd / mm / yy。您还需要根据用户区域设置格式化输入字段,或者使用更明确的new Date(year, month, day, hours, minutes, seconds, milliseconds)
而不是我显示的字符串快捷方式构建日期以上。)(就像我说的:日期很难!等到你尝试时区,它们会更有趣)
datediff现在包含两个日期之间的真实差异(以毫秒为单位)。
接下来发生的事情取决于你所谓的“几个月的差异”,因为几个月并不总是相同的长度。
如果你不关心精确度,你可以通过假装每个月有三十天并将datediff
除以(1000 * 60 * 60 * 24 * 30)来获得可能足够接近的近似值。如果你关心精确度,那么你已经离开了自己的领域,可能应该使用一个专门用于这种数学的库(momentjs是一个很好的。)
(还有很多其他SO问题涉及这类事情;任何一个依赖于字符串匹配而不是Date()的答案至少每四年一次就会出错,而且可能更常见。)
答案 1 :(得分:3)
以下逻辑会在几个月内产生差异
(endDate.getFullYear()*12+endDate.getMonth())-(startDate.getFullYear()*12+startDate.getMonth())
答案 2 :(得分:-1)
尝试删除你的价值
date2.val();
然后将值分配给您的输入。
date2.val(diffMonths);
答案 3 :(得分:-2)
试试这个。您可以在代码段中查看月份的差异。
$(function() {
// you can change the format to the way you want
$( "#datepicker1" ).datepicker({
yearRange: "-20:+100",
changeMonth: true,
changeYear: true,
dateFormat: "d-M-y"
});
$( "#datepicker2" ).datepicker({
yearRange: "-20:+100",
changeMonth: true,
changeYear: true,
dateFormat: "d-M-y"
});
});
function monthDiff(d1, d2) {
var months;
months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth();
months += d2.getMonth();
return months <= 0 ? 0 : months;
}
function cal() {
d1 = new Date($( "#datepicker1" ).val());
d2 = new Date($( "#datepicker2").val());
alert("The difference between two dates is: " +monthDiff(d1, d2));
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<p>Date1: <input type="text" id="datepicker1"></p>
<p>Date2: <input type="text" id="datepicker2"></p>
<button id="calculate" onclick="cal()"> Calculate </button>
&#13;