使用jquery以(mm / dd / yyyy)格式获取两个日期之间的差异

时间:2016-01-20 15:01:16

标签: javascript jquery html date

我想要检索用户使用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];
    });
}];

以下是我想要完成的图片演示:

enter image description here

我试图区分这两个条目(到期日 - 第一个付款日期)

enter image description here 我试图在用户点击“计算”按钮后进行计算,将月份差异替换为在到期日输入的值。

任何帮助将不胜感激!

4 个答案:

答案 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;
&#13;
&#13;