【问题标题】:fullCalendar UNIX timestamp conversion issues with selection event选择事件的 fullCalendar UNIX 时间戳转换问题
【发布时间】:2012-06-16 16:16:13
【问题描述】:

我正在使用 jQuery 小部件 DatePicker 和 Dialog 与 Adam Shaw http://arshaw.com/fullcalendar 的 fullCallendar 进行交互。我有很多工作要做。我可以使用 DatePicker 跳转到完整日历中的特定日期。当我选择预订活动时,会出现 jQuery 对话框,我使用 ajax 调用将字段发送到 php 脚本以处理数据。

然而,我的问题来自于 fullcalendar 的开始和结束变量中使用的 UNIX 时间戳。我在 html 文件的顶部设置了一个全局变量,并在 fullcalendar 中设置了选择的开始/结束时间,以便将数据传递给对话框。从对话框中,我将它传递给我的 PHP 脚本。但是,当我将该 UNIX 时间戳转换为“YmjHis”格式的日期时,我得到了奇怪的结果。

这里是fullcalendar中“select”方法的相关代码:

select: function(start, end, allDay) { 
        // need to check the day first. If the selected day/time < today, throw an alert
        // otherwise allow the booking of the conference.
            var now = calendar.fullCalendar('getDate');
            if (start < now )
            {
                alert('You cannot book a conference in the past!');
                calendar.fullCalendar( 'unselect' );
            }
            else
            {
                                    // set the global variables
                st = start;
                et = end;

                $('#dialog-form').dialog('open'); // open the dialog form
            }

            },

现在,在对话框中执行此操作(主要直接取自 jQuery UI 示例页面:

$( "#dialog-form" ).dialog({
        autoOpen: false,
        height: 300,
        width: 350,
        modal: true,
        buttons: {
            "Create Event": function() {
                var bValid = true;
                allFields.removeClass( "ui-state-error" );

                bValid = bValid && checkLength( name, "name", 3, 25 );
                bValid = bValid && checkLength( title, "title", 1, 20 );
                bValid = bValid && checkLength( email, "email", 6, 80 );
                bValid = bValid && checkLength( ports, "ports", 1, 2 );

                bValid = bValid && checkRegexp( name, /^[a-z]([0-9a-z_])+$/i, "Name may consist of a-z, 0-9, underscores, begin with a letter." );
                // From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
                // change to ensure a domain email address
                bValid = bValid && checkRegexp( email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. ui@jquery.com" );

                if ( bValid ) {
                    // code to insert into DB goes here
                    // need to somehow grab either a global variable or access
                    // full calendar start/end times from the selection phase
                    // in order to pass to the DB. 
                    $.ajax(
                    {
                        url: "bookings.php",
                        type: "POST",
                        data: {e: email.val(), t: title.val(), n: name.val(), p: ports.val(), start: +st, end: +et},                
                        dataType: "HTML",
                        success: function(data) {
                                $('.result').html(data);
                                // reload fullCalendar here maybe??
                            }
                    });
                    $( this ).dialog( "close" );
                }
            },
            Cancel: function() {
                $( this ).dialog( "close" );
            }
        },
        close: function() {
            allFields.val( "" ).removeClass( "ui-state-error" );
        }
    });

好的,现在我的 bookings.php 文件只有以下测试代码:

$file = 'variables.txt'; 
$arr= $_REQUEST; 
$fp = fopen($file, 'w') or die('Could not open file!');  
fwrite($fp, "variables are:\n");
foreach ($arr as $key => $value) { 
    $toFile = "Key: $key; Value: $value \n"; 
// write to file  
fwrite($fp, "$toFile") or die('Could not write to file'); 
}

// DEBUG CODE write some blank space
fwrite($fp, "\n\n") or die('Could not write to file');
$startTime = $_REQUEST['start'];
$endTime = $_REQUEST['end'];

$start = date('YmjHis', $startTime);
fwrite($fp, "start time: $startTime = $start\n") or die('Could not write to file');
$end = date('YmjHis', $endtime);
fwrite($fp, "end time: $endTime = $end\n") or die('Could not write to file');

// close file  
fclose($fp);

当我查看 variables.txt 文件时,我看到:

Key: e; Value: me@blah.com
Key: t; Value: blah
Key: n; Value: blah
Key: p; Value: 2
Key: start; Value: 1339610400000
Key: end; Value: 1339617600000


start time: 1339610400000 = 444200724160000
end time: 1339617600000 = 19691231160000

我希望开始和结束时间的格式如下:20120613113000,哦,不是以 1969 年的日期结束。

所以我的转换显然做错了什么。这是完整实施 fullCalendar 来做我需要做的事情的最后一个障碍,我很难过。非常感谢任何帮助。

【问题讨论】:

  • 我应该指出,我在其他地方进行了完全相同的转换以显示来自数据库的事件,并且效果很好。

标签: jquery global-variables fullcalendar unix-timestamp


【解决方案1】:

现在您的开始时间和结束时间中的零似乎太多了。我的猜测是,当您将其从请求中拉出时,它会因某种原因得到填充。

Unix 转换

开始时间
1339610400000 = 07/24/20 @ 6:00:00pm EST in (M/D/Y @ h:m:s)

结束时间 1339617600000 = 10/16/20 @ 2:00:00am EST in (M/D/Y @ h:m:s)

我认为您使用的日期不是 2020 年,而是 2012 年,所以我将上面的数字缩短到 10 位数(截至 2012 年 6 月 12 日 @ 下午 12:57 = 1339610258 的当前 TS)

开始时间 1339610400 = 2012 年 6 月 12 日 @ 东部标准时间下午 1:00:00

结束时间 1339617600 = 2012 年 6 月 13 日/@美国东部标准时间下午 3:00:00

现在这看起来更像是您在日历中预订的日期。

我的猜测是你在约会的某些地方得到了额外的零。

【讨论】:

  • 是的,我确实注意到了这一点,但不确定发生这种情况的原因和地点。我在声明时将变量初始化为 0,然后稍后再设置它们。所以我真的不明白。但如果我将时间戳截断为 10 个字符而不是 13 个字符,它应该可以工作。会尝试并回复您。
  • 好的,如果我像这样对输入执行 substr:$start = substr($_REQUEST['start'], 0, 10); $end = substr($_REQUEST['end'], 0, 10);我最终得到以下结果: Key: start;值:1339695000000 键:结束;值:1339700400000 开始时间:1339695000 = 20120614103000 结束时间:1339700400 = 19691231160000 虽然开始时间是正确的,但结束时间应该是 20120615120000,但我得到的是 1969 年。
  • 在 jquery 对话框中计算 +st 和 +et 的位置
  • st 和 et 是在我的脚本顶部设置为 0 的全局变量。后来,在 fullcalendar 的选择函数中,我将它们分别设置为 start 和 end。我看不到在不使用全局变量的情况下传递开始和结束时间的方法。并且 fullcalendar 中没有访问器函数来获取我可以看到的当前选择开始/结束时间。
  • 好的,您的答案是正确的,现在可以完美运行。原来我的调试代码中有一个小错误,这就是为什么我得到了奇怪的结束日期/时间。所以,非常感谢内特。然而,为什么会产生额外填充的问题仍然是一个谜。有趣的是,如果我在调用 jQuery 对话框之前进行测试 ajax 调用,并从 fullcalendar 传递实际的开始和结束变量,我会在时间戳末尾得到相同的额外 3 个 0。这真的很奇怪。所以,fullcalendar(我使用的是最新的 1.5.3)正在做一些事情。现在将其存储在数据库中并刷新!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多