- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试制作一个在互联网上找到的脚本来处理我的 ics 文件,以便我可以将其添加到我的项目中。
如果我从 ics 文件中删除时区部分,该脚本可以正常工作。但因为该文件将从互联网上动态获取,所以我无法随时随地编辑它。因此,我必须以某种方式修改我的代码以跳过或使用该部分。
代码是( Source ):
/**
* Javascript ical Parser
* Proof of concept method of reading icalendar (.ics) files with javascript.
*
* @author: Carl Saggs
* @source: https://github.com/thybag/
* @version: 0.2
*/
function ical_parser(feed_url, callback){
//store of unproccesed data.
this.raw_data = null;
//Store of proccessed data.
this.events = [];
/**
* loadFile
* Using AJAX to load the requested .ics file, passing it to the callback when completed.
* @param url URL of .ics file
* @param callback Function to call on completion.
*/
this.loadFile = function(url, callback){
//Create request object
try {xmlhttp = window.XMLHttpRequest?new XMLHttpRequest(): new ActiveXObject("Microsoft.XMLHTTP");} catch (e) { }
//Grab file
xmlhttp.onreadystatechange = function(){
if ((xmlhttp.readyState == 4) && (xmlhttp.status == 200)) {
//On success, run callback.
callback(xmlhttp.responseText);
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
}
/**
* makeDate
* Convert the dateformat used by ICalendar in to one more suitable for javascript.
* @param String ical_date
* @return dt object, includes javascript Date + day name, hour/minutes/day/month/year etc.
*/
this.makeDate = function(ical_date){
//break date apart
var dt = {
year: ical_date.substr(0,4),
month: ical_date.substr(4,2),
day: ical_date.substr(6,2),
hour: ical_date.substr(9,2),
minute: ical_date.substr(11,2)
}
//Create JS date (months start at 0 in JS - don't ask)
dt.date = new Date(dt.year, (dt.month-1), dt.day, dt.hour, dt.minute);
//Get the full name of the given day
dt.dayname =["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"][dt.date.getDay()];
return dt;
}
/**
* parseICAL
* Convert the ICAL format in to a number of javascript objects (Each representing a date)
*
* @param data Raw ICAL data
*/
this.parseICAL = function(data){
//Ensure cal is empty
this.events = [];
//Clean string and split the file so we can handle it (line by line)
cal_array = data.replace(new RegExp( "\\r", "g" ), "").split("\n");
//Keep track of when we are activly parsing an event
var in_event = false;
//Use as a holder for the current event being proccessed.
var cur_event = null;
for(var i=0;i<cal_array.length;i++){
ln = cal_array[i];
//If we encounted a new Event, create a blank event object + set in event options.
if(!in_event && ln == 'BEGIN:VEVENT'){
in_event = true;
cur_event = {};
}
//If we encounter end event, complete the object and add it to our events array then clear it for reuse.
if(in_event && ln == 'END:VEVENT'){
in_event = false;
this.events.push(cur_event);
cur_event = null;
}
//If we are in an event
if(in_event){
//Split the item based on the first ":"
idx = ln.indexOf(':');
//Apply trimming to values to reduce risks of badly formatted ical files.
type = ln.substr(0,idx).replace(/^\s\s*/, '').replace(/\s\s*$/, '');//Trim
val = ln.substr(idx+1,ln.length-(idx+1)).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
//If the type is a start date, proccess it and store details
if(type.indexOf('DTSTART') != -1 ){
dt = this.makeDate(val);
val = dt.date;
//These are helpful for display
cur_event.start_time = dt.hour+':'+dt.minute;
cur_event.start_date = dt.day+'/'+dt.month+'/'+dt.year;
cur_event.day = dt.dayname;
}
//If the type is an end date, do the same as above
if(type.indexOf('DTEND') != -1 ){
dt = this.makeDate(val);
val = dt.date;
//These are helpful for display
cur_event.end_time = dt.hour+':'+dt.minute;
cur_event.end_date = dt.day+'/'+dt.month+'/'+dt.year;
cur_event.day = dt.dayname;
}
//Convert timestamp
if(type =='DTSTAMP') val = this.makeDate(val).date;
//Add the value to our event object.
cur_event[type] = val;
//console.log(cur_event);
}
}
//Run this to finish proccessing our Events.
this.complete();
}
/**
* complete
* Sort all events in to a sensible order and run the original callback
*/
this.complete = function(){
//Sort the data so its in date order.
this.events.sort(function(a,b){
return a.DTSTART-b.DTSTART;
});
//Run callback method, if was defined. (return self)
if(typeof callback == 'function') callback(this);
}
/**
* getEvents
* return all events found in the ical file.
*
* @return list of events objects
*/
this.getEvents = function(){
return this.events;
}
/**
* getFutureEvents
* return all events sheduled to take place after the current date.
*
* @return list of events objects
*/
this.getFutureEvents = function(){
var future_events = [], current_date = new Date();
this.events.forEach(function(itm){
//If the event starts after the current time, add it to the array to return.
if(itm.DTSTART > current_date) future_events.push(itm);
console.log(itm);
});
return future_events;
}
/**
* load
* load a new ICAL file.
*
* @param ical file url
*/
this.load = function(ical_file){
var tmp_this = this;
this.raw_data = null;
this.loadFile(ical_file, function(data){
//if the file loads, store the data and invoke the parser
tmp_this.raw_data = data;
tmp_this.parseICAL(data);
});
}
//Store this so we can use it in the callback from the load function.
var tmp_this = this;
//Store the feed url
this.feed_url = feed_url;
//Load the file
this.load(this.feed_url);
}
我认为问题始于 getFutureEvents,它将当前日期与文件上的日期进行比较。
我的文件如下所示:
BEGIN:VEVENT
DTSTAMP:20170217T034951Z
DTSTART;TZID=Europe/London:20170330T090000
DTEND;TZID=Europe/London:20170330T100000
SUMMARY:Blah Blah Blah
LOCATION:Blah 0.20
DESCRIPTION:Week Number: 9\nBuilding: Blah\nRoom: 0.30\nUnit Ref: U
87454/n
Lecturer: Blah\,Blah
LAST-MODIFIED:20170217T034950Z
END:VEVENT
示例 ics 文件如下所示:
BEGIN:VEVENT
UID:uid_1@test.com
DTSTAMP:20120120T130000Z
ORGANIZER;CN=Test:MAILTO:test@test.com
DTSTART:20120507T130000Z
DTEND:20120507T140000Z
SUMMARY:Intro to Witchcraft and wizardry
DESCRIPTION:A Description of this Event here
END:VEVENT
最佳答案
我已经编辑了 parseICAL
方法,它现在似乎足以满足您的需求(但仍然不完美)。这是我的更改:
this.parseICAL = function(data){
/* ... */
for(var i=0;i<cal_array.length;i++){
ln = cal_array[i];
ln = ln.trim(); // <-- here I'm trimming every line, because I noticed
// that spaces was causing some problems
/* ... */
if(in_event){
idx = ln.indexOf(':');
type = ln.substr(0,idx).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
val = ln.substr(idx+1,ln.length-(idx+1)).replace(/^\s\s*/, '').replace(/\s\s*$/, '');
type = type.split(';')[0]; // <-- and here I am removing everything
// after semicolon in types
/* ... */
}
}
this.complete();
}
我希望它现在能发挥作用,它对我有用。
关于Javascript iCal 解析器脚本忽略时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42304405/
我有一个包含 iCal 事件信息的文件 (/test.txt)。 Friday, May 6, 2011 4:00:00 PM 05/08/2011 11:20:00 PM summary locat
我正在尝试反序列化 iCal 文件,然后将集合映射到自定义 POCO。问题是我不确定属性存储在哪里。 这是反序列化方法 public static IICalendarCollection Deser
我正在尝试在收到通知后立即从 iCal 中删除事件。仅当 iCal 在后台时,事件才会被删除。如果在关闭 iCal 后发送相同的通知,则事件不会被删除。我正在尝试在 MyCalendar.m 中使用此
我正在使用 DDay.iCal 创建 iCal 源.它有效,但我不知道如何设置提要的时区。这是基本代码: iCalendar iCal = new iCalendar(); // (); evt.St
您好,我正在从 DDay.ical 迁移到 Ical.Net nuget pacakages,但我被困在以下代码中,该代码在 DDay.Ical 日历中添加了时区,请帮忙 上一个代码: List ls
我正在编写一个 Mac 应用程序。在这个应用程序中,我想让用户将一些元素变成日历事件。我希望用户能够将元素拖到 iCal 中,最好也拖到 BusyCal 中。但我不知道在拖动粘贴板上放什么。 我希望能
问题 一些重复发生的事件并没有真正在某个时候结束(比如俱乐部 session ?),取决于其他条件(比如假期)。但是,每年都需要手动添加这些异常(exception)情况,因为日期可能不同。 研究 我
我试图了解 iCal feed 和 iCalendar 客户端如何处理过去和 future 的大量事件。有没有什么方法可以让 iCalendar 客户端将日期范围传达给 iCalendar 提要,以便
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在尝试制作一个在互联网上找到的脚本来处理我的 ics 文件,以便我可以将其添加到我的项目中。 如果我从 ics 文件中删除时区部分,该脚本可以正常工作。但因为该文件将从互联网上动态获取,所以我无法
我正在处理一个现有的 ical 文件。我不确定是谁创建的,我想在联系他们之前更加熟悉 ical - 这样我就可以进行明智的对话。 谁能告诉我一个很好的 iCal 初学者教程? 到目前为止,我发现的大部
我只能找到获得 ISO 8601 周的算法(周从星期一开始)。 然而,iCal规范说 A week is defined as a seven day period, starting on the
也许是个愚蠢的问题,但我想知道 iCal 客户端如何查询远程日历。 我刚刚创建了一个生成 iCal 文件的小型 Web 服务。这个文件被 Google Calendar 和 Lightning(新 S
我目前正在用 php 编写一个 .ics 文件。我想知道 VEVENT 是否总是需要有一个结束日期? 比如……这是允许的吗? BEGIN:VEVENT UID:d3f760e29fa3f482199f
我编写了一个脚本来根据我数据库中的事件生成一个 iCal 日历。这是一个示例输出: BEGIN:VCALENDAR VERSION:2.0 PRODID:-//hacksw/handcal//NONS
我正在尝试编写一个 AppleScript 来查询 iCal 并在任何日历中查找给定日期的所有事件。 我首先编写了一个简单的脚本,它对给定日历中的每个事件执行一些简单的操作: tell applica
我正在我的应用程序中设置提醒。我已使用 EKEvent 将自定义事件添加到 iCal。现在,当我从 iCal 检索事件时,我会获取当天发生的所有事件。有没有办法仅获取/检索通过我的应用程序添加的事件,
iCal 附件能否在 description 属性中包含 HTML?如果是这样,有什么限制? 最佳答案 经过一些研究和测试。答案是否定的。意思是:你可以把它扔进去,但你不应该。 RFC 并没有严格禁止
我正在尝试弄清楚如何在 iCal 文件的“描述”部分中对换行符进行编码,以便它们能够正确导入到 Outlook、Google 日历和 Apple 日历中。 我继承的原始代码使用“=0D=0A”和引用打
首先我看过这个问题here和 here这对解决我的问题没有帮助: 我正在使用此处稍微修改过的 ics.js 代码 github link var ics = function() { 'use str
我是一名优秀的程序员,十分优秀!