【问题标题】:Google Script/JavaScript Converting time between timezonesGoogle Script/JavaScript 在时区之间转换时间
【发布时间】:2017-03-05 20:20:12
【问题描述】:

我经常旅行,而且我经常有约会(例如航班)从一个时区开始,到另一个时区结束。我需要知道每个活动开始和结束的本地时间和 UTC 时间。

我使用 Google 日历并在日历事件中指定不同的开始和结束时区。

我编写了一个脚本,可以在给定时间段内提取我的议程,它显示了我当地时间的所有内容,这很好。

我很难获得当地时间。

当我检索事件时,时间显示为我的当地时间。

我可以检索欧洲/罗马等格式的时区,但这并不能帮助我显示当地时间。

附件是我日历中的一个条目的屏幕截图:

这是从我的脚本中看到的事件(取自日志文件):

Start: 2017-03-29T16:35:00+01:00, startTimeZone: Europe/Berlin.
End: 2017-03-29T22:30:00+01:00, endTimeZone: Asia/Qatar

这些时间应该分别是开始:17:35 和结束:00:30。

有人对如何获取当地时间或在时区之间转换有任何想法吗?

【问题讨论】:

  • 显示几行脚本。脚本中的任何日期代码都使用脚本的时区作为默认时区。您的脚本有自己的时区,与日历时区不同。默认情况下,时区是相同的,除非您更改它们。您在哪里显示脚本中的时间?在对话框或边栏中?在电子表格中?
  • 嗨桑迪,感谢您的回复。我不认为我问的问题很好。我的日期格式为2017-03-30T01:01:00+01:00,时区为Asia/Qatar。我想在我的电子表格中将时间显示为03:01,这是约会发生时在卡塔尔的时间。从我的脚本返回的时间是我日历的当地时间,这很好。我需要将其调整为事件发生所在的时区。不同的夏令时开始和结束日期和规则会变得很困难,所以我真的想要一种方式来说明给定日期的Asia/Qatar 是 GMT +/- X小时。
  • 我会先让您查看Utilities.formatDate() 的文档,这可能会自动处理夏令时问题,因此您不需要自己编程。 Link to Apps Script documentation
  • 谢谢。这使用三个字母的时区,例如GMT、PST 等。或者它使用偏移量,例如+6。不幸的是,谷歌日历用户的时区格式为“亚洲/卡塔尔”(这将是“AST”或“+3”)。我需要从一个动态转换到另一个:(
  • 您需要一份长文本格式的所有时区列表吗?我通过在浏览器开发工具中检查我认为的日历设置的 HTML 得到了一个列表。如果您认为它可能会有所帮助,我有这份清单。

标签: javascript datetime google-apps-script timezone google-calendar-api


【解决方案1】:

希望这对您有所帮助。

function timezones()
{
  var today = new Date();
  var hour = 3600000;
  var tz = '';
  today = new Date(today.getTime() + (13 * hour));
  var s = '<div id="mydiv">';
  for(var i = 12;  i >= -11; i--)
  {
    if(i > 0){ tz = 'GMT+' + i;}
    if(i == 0){tz = 'GMT';}
    if(i < 0){tz = 'GMT' + i;}
    today = new Date(today.getTime() - hour);
    s += '<div class="myDates">' + Utilities.formatDate(today,"GMT", "'Date:'yyyy-MM-dd' Time:'HH:mm:ss") + 'TimeZone; "' + tz + '"</div>';
  }
  s += '</div>';
  dispStatus('Timezones', s);
}

这是我使用的显示例程。

function dispStatus(title,html,width,height,modal)
{
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 400;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var modal = typeof(modal) !== 'undefined' ? modal : false;
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
 if(!modal)
 {
   SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
 }
 else
 {
   SpreadsheetApp.getUi().showModalDialog(htmlOutput, title);
 }
} 

here 是时区地图。

【讨论】:

  • 嗨库珀。感谢您的回复。我不认为我问的问题很好。基本上,我会在本地日历的时区取回日期和时间。实际约会在另一个时区,并且有一个 timezone 属性可以告诉我它所在的时区。我想将本地时间添加到我的电子表格中,例如我在Asia/Qatar 时区得到22:30,我想将其显示为00:30,即约会发生时在卡塔尔的时间。
  • 基本上你需要为东经每15度增加一个小时,西经每15度减去一个小时。仔细看看这个map,它讲述了整个故事。
  • 谢谢,但是拥有“亚洲/卡塔尔”时区并没有给我纬度/经度,所以我无法计算时区东或西多少度。它也不涉及夏令时,夏令时因国家而异,有时甚至在国家内部也不同。我需要它来处理我日历中的不断变化,所以我需要一种动态计算本地时间的编程方式:/
  • 所以我会使用this API
  • 谢谢。不过,它相当昂贵。我想我将不得不尝试建立一个数据库并运行一些可怕的查询来检查每个条目。令人讨厌的是,谷歌不允许我从日历中获取数据,其中记录是在本地时间输入并显示 UTC 偏移量。如果我可以从日历中获取该信息,那就完美了:(
【解决方案2】:
<h1>Calendar Play</h1>
function calendarTesting()
    {

  var rngA = CalendarApp.getAllOwnedCalendars();
  var s='';
  for(var i = 0;i < rngA.length; i++)
  {
    s += '<div id="Cal' + i + '"><Strong>Name: </strong>' + rngA[i].getName();
    s += '<br /><strong>Color: </strong><span style="color:'+ 'black' +';">' + rngA[i].getColor() + '</span>';
    s += '<br /><strong>Description: </strong>' + rngA[i].getDescription();
    var pri = (rngA[i].isMyPrimaryCalendar())? 'Yes': 'No';
    s += '<br /><strong>IsMyPrimaryCalender: </strong>' + pri + '</div>';
    s += '<style>#Cal'+ i +'{background-color:'+ rngA[i].getColor() +';padding:10px;}</style>';

  }
  var now = new Date();
  var ForWeeksFromNow = new Date(now.getTime() + (28 * 24 * 60 * 60 * 1000));
  var events = CalendarApp.getDefaultCalendar().getEvents(now,ForWeeksFromNow);
  for(var j = 0; j < events.length; j++)
  {
    s+= '<div style="border:1px solid black;padding:10px 50px 10px 10px;">';
    s += '<div style="float:right;font-size:48px;">' + Utilities.formatDate(events[j].getStartTime(),"GMT-7", "E") + '</div>';
    s += '<br /><strong>Title: </strong>' + events[j].getTitle();
    s += '<br /><strong>Start: </strong>' + Utilities.formatDate(events[j].getStartTime(),"GMT-7", "MMM dd HH:mm");
    s += '<br /><strong>End: </strong>' + Utilities.formatDate(events[j].getEndTime(), "GMT-7", "MMM dd HH:mm");
    s += '<div style="float:right;font-size:12px;">' + events[j].getDescription() + '</div>';
    s += '</div>';

  }
  s += '<br /><br /><input type="button" value="Exit" onClick="google.script.host.close();" />';
  var title = 'Calendar for: ' + Utilities.formatDate(now, "GMT-7", "E MMM dd, yyyy");
  dispStatus(title, '<p>' + s + '</p>',600,500);
}

function dispStatus(title,html,width,height)
{
// Display a modeless dialog box with custom HtmlService content.
  var title = typeof(title) !== 'undefined' ? title : 'No Title Provided';
  var width = typeof(width) !== 'undefined' ? width : 250;
  var height = typeof(height) !== 'undefined' ? height : 300;
  var html = typeof(html) !== 'undefined' ? html : '<p>No html provided.</p>';
  var htmlOutput = HtmlService
     .createHtmlOutput(html)
     .setWidth(width)
     .setHeight(height);
  SpreadsheetApp.getUi().showModelessDialog(htmlOutput, title);
} 

【讨论】:

  • 谢谢,Cooper,但这似乎是硬编码时区偏移 (GMT-7)。我需要它从“欧洲/伦敦”或“亚洲/卡塔尔”或“太平洋/塔拉瓦”或“美国/纽约”或日历事件可能开始或结束的任何其他时区动态工作。因此,它必须是可以处理任何场景的通用解决方案 - 我希望我可以对其进行硬编码,因为生活会很简单,但不幸的是我的用例是动态的。
  • 在 timeanddate.com 上查看 API。它们不是免费的,但它们或许能够帮助您解决问题。
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 2021-03-05
相关资源
最近更新 更多