将 Gmail 日期转换为您在 Gmail 账户中显示的 DateTime

5
我正在使用Gmail API在我的c# ASP.net应用程序中获取收件箱消息。所有消息来自不同的时区(州/国家),我想要以我的本地时区显示它们的日期,就像在Gmail应用程序中显示的那样。我搜索了很多关于时区之间转换的资料,但无法解决它,可能是我没有正确理解。我迄今为止尝试的代码如下:(它对大多数消息有效,但对其中一些消息未能正确显示DateTime)
例如:
在Gmail应用程序中显示的时间:2017年11月30日上午2:11 从Gmail API获取的输入/值:2017年11月29日星期三10:11:35 -0800
以下是我当前从gmail收件箱消息中获取的一些值:

enter image description here

 var re = service.Users.Messages.List("me");
 re.LabelIds = "INBOX";
 re.Q = "is:all";
 var res = re.Execute();
 if (res != null && res.Messages != null)
 {               
   foreach (var email in res.Messages)
   {    
     var emailInfoResponse = service.Users.Messages.Get("me", email.Id).Execute();
    if (emailInfoResponse != null)
    {
      foreach (var mParts in emailInfoResponse.Payload.Headers)
      {
        if (mParts.Name == "Date")
        {
          date = mParts.Value;
        }          
      }
    }
  }
}

My Time Zone is: (UTC+08:00) Perth

任何帮助将不胜感激。谢谢!

1
你从Gmail API中获取的实际数据是什么(希望它包含时区信息)? - EdSF
很令人困惑,请提供您从 Gmail API 获取的实际日期时间数据。 - EdSF
2
我现在正在查看Gmail API文档,似乎internalDate字段比Date头更可靠。你尝试过使用它吗? - Matt Johnson-Pint
编辑后将在几秒钟内添加所有值的图片。抱歉,我不知道内部日期,我会检查一下。 - Preet
@Matt Johnson 我尝试获取内部日期,但所有消息都返回 null 值:date = email.InternalDate.ToString(); - Preet
显示剩余5条评论
1个回答

10
{
  "id": string,
  "threadId": string,
   ....
  "internalDate": long,
  "payload": {
   ....

internalDate long
内部邮件创建时间戳(epoch ms),用于确定收件箱中的排序。对于普通SMTP接收的电子邮件,它代表了消息最初被Google接受的时间,这比Date头更可靠。但是,对于API迁移的邮件,客户端可以根据Date头来配置它。

参考文献: https://developers.google.com/gmail/api/v1/reference/users/messages

根据上述Google文档,以下是一种方法:

//Some epoch time in ms
var gmail_date = 1512007768005; 

//Get DateTime of epoch ms
var to_date = DateTimeOffset.FromUnixTimeMilliseconds(gmail_date).DateTime;

//This is your timezone offset GMT +8
var offset = 8;

Console.WriteLine(to_date - new TimeSpan(offset *-1, 0, 0));

获取 2017年11月30日 上午10:09:28 的信息


我不知道如何获取它的值,我得到了内部日期的空值。你能帮我一下吗?我正在使用:date = email.InternalDate.ToString(); - Preet
1
@EdSF - 不要手动操作偏移量。使用适当的ID和TimeZoneInfo.ConvertTime。在这种情况下,ID是“W. Australia Standard Time”。 - Matt Johnson-Pint
@Preet - 不要调用 ToString。在 .NET 客户端库中,InternalDate 字段是一个 long?,所以只需调用 .Value。如果您正在查看单个消息的 Get 调用的响应,则它不会为 null。 - Matt Johnson-Pint
1
@Preet - 该方法是在.NET 4.6中添加的。您可以升级您的目标,或者您可以自己实现该方法。 - Matt Johnson-Pint
谢谢你,@Matt。我必须说你非常支持人,太棒了:) - Preet
显示剩余5条评论

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