我在c#ASP.net应用程序中使用Gmail API获取收件箱邮件。所有邮件都来自不同的时区(州/国家/地区),我想在我自己的时区显示日期,因为它显示在Gmail应用中。我搜索了很多时区之间的转换,但无法解决它可能是我没有得到正确的。
我的代码但是我到目前为止尝试的是:(它适用于大多数消息,但很少有消息显示正确的DateTime)
例如:
Gmail应用中显示的时间:2017年3月30日上午2:11
我的代码来自Gmail API的输入/值:2017年11月29日星期三10:11:35 -0800
以下是我从当前的Gmail收件箱邮件中获得的一些值:
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
任何帮助将不胜感激。谢谢!
答案 0 :(得分:4)
{
"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));