如何创建一个链接以添加日历项?

107

我正在为这家夜总会工作,现在正在为他们制作网站,他们有许多活动,网站也是围绕着活动构建的。今天他们在Facebook上为每个事件创建了一个活动,但是拥有一个"添加到我的日历"按钮将其添加到你的iCal或Google日历(甚至可能是Outlook)将会更好。

我已经成功地找出如何制作日历提要,但它将被添加为新日历,唯一的好处是人们可以“订阅事件”,但是为每个事件都有一个日历非常混乱。因此,我想知道如何实现一个函数,使他们可以轻松地将其添加到他们的主日历中。如果可能的话,像mailto:链接一样,但用于日历。

还有,顺便问一下,是否有人知道是否可以自动将Facebook上的事件导入WordPress或将WordPress上的事件导出到Facebook,那就太好了,但这并不那么重要。


相关内容:https://dev59.com/KGEh5IYBdhLWcg3wIgjN - Denilson Sá Maia
6个回答

111

Dave帖子中的链接非常好。以下是有关Google链接的一些技术细节:

Google日历链接

<a href="http://www.google.com/calendar/event?action=TEMPLATE&text=示例事件&dates=20131124T010000Z/20131124T020000Z&details=事件详情在此处&location=纽约州示例市主街123号">添加到gCal</a>

参数如下:

  • action = TEMPLATE(必需)
  • text(事件名称的URL编码)
  • dates(ISO日期格式,开始日期/结束日期 - 必须同时具有开始和结束时间 - 按钮生成器会让您将结束时间留空,但您必须有一个,否则它将无法工作)。
    • 使用用户的时区:20131208T160000/20131208T180000
    • 使用全球时间,请转换为UTC,然后使用20131208T160000Z/20131208T180000Z
    • 整天活动,您可以使用20131208/20131209 - 请注意,按钮生成器会出错。对于一天的全天事件,必须使用以下日期作为结束日期,或者将其加1天以得到您想要的结束日期。
  • details(事件描述/详细信息的URL编码)
  • location(事件位置的URL编码 - 确保它是Google地图可以轻松读取的地址)。

2018年2月更新:

这是一个新的链接结构,似乎支持新版本的Google日历而无需API交互:

https://calendar.google.com/calendar/r/eventedit?text=My+Custom+Event&dates=20180512T230000Z/20180513T030000Z&details=For+details,+link+here:+https://example.com/tickets-43251101208&location=Garage+Boston+-+20+Linden+Street+-+Allston,+MA+02134

新的基本URL: https://calendar.google.com/calendar/r/eventedit

新参数:

  • text (事件名称)
  • dates (ISO日期格式,开始时间/结束时间 - 必须同时拥有开始和结束时间)
    • 带有开始/结束时间的事件:20131208T160000/20131208T180000
    • 全天事件,您可以使用20131208/20131209 - 结束日期必须比您想要的结束日期多一天
  • ctz (时区,例如America/New_York - 留空以使用用户的默认时区。强烈建议在几乎所有情况下都包含此信息。例如,对于视频会议的提醒:如果三个不同时区的人单击此链接并设置“自己”的星期二上午10:00的提醒,则这将无法正常工作。)
  • details (url编码的事件说明/详细信息)
  • location (url编码的事件地点 - 确保它是Google Maps可以轻松读取的地址)
  • add (以逗号分隔的电子邮件列表 - 将嘉宾添加到您的新事件中)

备注:

  • 上述旧URL结构现在重定向到此处
  • 支持https
  • 更好地处理时区
  • 接受+作为空格,除了%20(在php中的urlencoderawurlencode都可以使用)

  • 2
    如果有人感兴趣,我创建了一个PHP函数,可以构建此类型的Google日历链接:https://gist.github.com/squarecandy/26611bbcfc63f9c7e3a7dc45e9145133 - squarecandy
    2
    值得注意的是,除非我同时指定时区日期和ctz参数,否则时区不会为我设置。更多信息请参见: https://zaclee.net/php/formatting-google-calendar-links-with-timezones-and-php-carbon - Zachary Schuessler
    1
    &authuser=xyz@gmail.com将允许您选择特定的Gmail帐户。如果您在浏览器中登录了多个Gmail帐户,并且想要将日历事件添加到特定的帐户中,这将非常有用。 - Abdulgood89
    1
    PHP函数的更新URL:https://gist.github.com/petertwise/26611bbcfc63f9c7e3a7dc45e9145133 - squarecandy
    1
    /eventedit的URL在已安装Google日历应用(v23.13.0测试)的iOS上不起作用(已在16.4.1上测试)。启动了应用程序,但之后什么也没有发生。 /event?action=TEMPLATE的URL在应用程序和浏览器中都可以正常使用。 - zh.
    显示剩余6条评论

    55

    更新(个人使用免费):
    现在支持 HTTPS

    虽然我下面的回答详细介绍了每个服务的操作方法,但是在我看来,现在用第三方工具像AddThisEvent [https://addthisevent.com]会更容易。它可以让你自定义很多选项,还可以添加到Facebook等。不过,除个人使用外,他们现在已经将其变成付费服务。

    我认为可能还有其他像这个一样的第三方解决方案,但我只能说这一个对我们来说很棒。


    如果要添加到 Google 日历,他们曾经有一个代码生成器,但现在已经撤下了。关于 Google 日历链接的更多详细信息,请参见下面 squarecandy 的回答

    对于 Outlook,稍微复杂一些,但基本上需要创建一个带有事件数据的.vcs文件,并制作一个指向该文件的链接。请查看这里的逐步说明

    对于 iCal 链接,您可以使用像这个PHP类,或者遵循这个页面的说明来创建ics文件(iCal文件)。


    18
    谢谢,遗憾的是像mailto:那样有一个通用标准来处理这个问题是不存在的。 - Hultner
    谷歌的“事件发布者指南”页面似乎不再提供生成URL的表单(很遗憾,谷歌文档的性质就是不断变化),但@squarecandy的URL格式仍然可以正常使用(至少对于谷歌日历来说是这样)! - chbrown
    他们自己的表单甚至没有生成可用的链接,所以这可能是他们将其撤下的原因。 :) - squarecandy

    10

    在squarecandy的谷歌日历贡献之外,这里是崭新的

    OUTLOOK日历格式(无需创建.ics文件)!!

    <a href="https://bay02.calendar.live.com/calendar/calendar.aspx?rru=addevent&dtstart=20151119T140000Z&dtend=20151119T160000Z&summary=Summary+of+the+event&location=Location+of+the+event&description=example+text.&allday=false&uid=">add to Outlook calendar</a>
    

    测试一下

    最好对“summary”、“location”和“description”变量的值进行url编码。

    为了知识的完整性,

    雅虎日历格式

    <a href="https://calendar.yahoo.com/?v=60&view=d&type=20&title=Summary+of+the+event&st=20151119T090000&et=20151119T110000&desc=example+text.%0A%0AThis+is+the+text+entered+in+the+event+description+field.&in_loc=Location+of+the+event&uid=">add to Yahoo calendar</a>
    

    测试它

    不使用第三方工具进行操作有很多优点,例如在电子邮件中使用。


    8
    似乎Outlook的链接现在并没有真正起作用。它会添加位置并打开新的事件表单,但不会填写任何其他字段。 - Steve
    10
    补充@Steve的评论,Outlook链接现在甚至无法解析到服务器 - 我收到了DNS解析错误。 - Owen Blacker
    5
    抱歉,这个答案需要更新才能生效,已经被投票降权。 - webaholik
    不再起作用了 - Alan Fuller

    1
    Litmus有一篇很棒的文章,详细介绍了如何建立一个整洁的解决方案,可以在主要的电子邮件和日历客户端上良好运行,包括为使用不同供应商的客户端的用户提供服务。鉴于这个领域的非标准化特性,这远非简单,但如果你愿意花几天时间,你可以得到一个工作良好且没有月费和使用限制的东西!

    https://www.litmus.com/blog/how-to-create-an-add-to-calendar-link-for-your-emails/


    0
    您可以生成一个包含会议信息的ics文件。
    ics文件看起来像这样。
    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Michael Angstadt//biweekly 0.6.4//EN
    METHOD:REQUEST
    BEGIN:VEVENT
    UID:c7a913c7-3276-4828-8606-b841f2870475
    DTSTAMP:20220519T070000Z
    SUMMARY: Booking you for this date
    DESCRIPTION:You having been invited to the event 
    DTSTART:20220519T070000Z
    DURATION:PT1H
    ORGANIZER;CN=Company Team:mailto:info@XXXXXX.com
    ATTENDEE;ROLE=REQ-PARTICIPANT;CN=Not Amazing Attendee:mailto:*********@gmail.com
    END:VEVENT
    END:VCALENDAR
    

    同时这里提供生成ics文件的Java代码

    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    
    public class iCal {
    
        private String version = "VERSION:1.0 \n";
        private String prodid = "PRODID://Elara/lofy/tanare/delp/314sum2015// \n";
        private String calBegin = "BEGIN:VCALENDAR \n";
        private String calEnd = "END:VCALENDAR \n";
        private String eventBegin = "BEGIN:VEVENT \n";
        private String eventEnd = "END:VEVENT \n";
    
        public void iCal() {
        }
    
        public static void main(String[] args) {
    
        }
    
        public void write(String name) {
            StringBuilder builder = new StringBuilder();
            builder.append(name);
            builder.append(".ics");
    
            String testExample = "UID:uid1@example.com\\nDTSTAMP:19970714T170000Z\\nORGANIZER;\n"
                    + "    CN=John Doe:MAILTO:john.doe@example.com\\nDTSTART:19970714T170000Z\n"
                    + "    \\nDTEND:19970715T035959Z\\nSUMMARY:Bastille Day Party\\n";
    
            try {
    
                File file = new File(builder.toString());
    
                // if file doesnt exists, then create it
                if (!file.exists()) {
                    file.createNewFile();
                }
    
                FileWriter fw = new FileWriter(file.getAbsoluteFile());
                BufferedWriter bw = new BufferedWriter(fw);
                bw.write(calBegin);
                bw.write(version);
                bw.write(prodid);
                bw.write(eventBegin);
                bw.write(testExample);
                bw.write(eventEnd);
                bw.write(calEnd);
    
                bw.close();
    
                System.out.println("Done");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } 
    

    -2

    您可以让程序创建一个 .ics(iCal)版本的日历,然后将此 .ics 导入到任何您想要的日历程序中:Google、Outlook 等。

    我知道这篇文章相当古老,所以我不会费心输入任何代码。但如果您希望我提供如何执行此操作的概述,请在评论中留言。


    7
    如果可以的话,我需要一个这个代码的示例,我想在Outlook、Gmail和iCal上实现完全相同的功能。 - KidCache

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接