GMAIL API - 日期搜索(时区不清楚)

Posted

技术标签:

【中文标题】GMAIL API - 日期搜索(时区不清楚)【英文标题】:GMAIL API - Date search (timezone unclear) 【发布时间】:2022-01-23 13:52:54 【问题描述】:

根据https://developers.google.com/gmail/api/guides/filtering,如果搜索日期,则使用 PST 时区。

我有一封电子邮件:

 Date: Tue, 27 Jul 2021 06:07:49 GMT (06:07 AM)

如果将其转换为 PST 时区,则应为:

Date: Mon, 26 Jul 2021 23:07:49 PST (11:07 PM)

现在当我使用查询时

after:2021/07/27

找到了电子邮件,但不应该根据定义(当我直接在 gmail.com 上搜索时)。

查询

before:2021/07/27

什么都不返回。

我还没有找到关于如何按日期正确搜索以及真正应用了哪些时区的说明。

我正在使用 google-api-services-gmail-v1-rev110-1.25.0.jar。


附加信息:

String account = "myemail@gmail.com";

List<String> labelIds = new ArrayList<>();
labelIds.add("Label_mylabelid");
        
String query = "after:2021/07/27";
List<Message> timeZoneMsgs = gmail.users().messages().list(account).setQ(query).setLabelIds(labelIds).execute().getMessages();

我进行了另一项测试:我安排在第二天晚上 11:30 到凌晨 01:00 之间发送一些电子邮件。

以下是消息的日期标头(直接来自有效负载):

Scheduled mail 1
Date: Fri, 24 Dec 2021 23:30:00 +0100

Scheduled mail 2
Date: Fri, 24 Dec 2021 23:45:00 +0100

Scheduled mail 3
Date: Sat, 25 Dec 2021 00:00:00 +0100

Scheduled mail 4
Date: Sat, 25 Dec 2021 00:15:00 +0100

Scheduled mail 5
Date: Sat, 25 Dec 2021 00:30:00 +0100

Scheduled mail 6
Date: Sat, 25 Dec 2021 00:45:00 +0100

Scheduled mail 7
Date: Sat, 25 Dec 2021 01:00:00 +0100

如果我搜索

after:2021/12/25 

直接在 gmail.com 上 - 我会收到 3 到 7 条消息,如果我搜索的话

before:2021/12/25

我得到 1 和 2,都是正确的。

但是当我对 java 调用执行相同操作时,我只收到消息 7(凌晨 1 点)表示“after:2021/12/25”和消息 1-6 表示“before:2021/12/25”。


另一个例子:

我还尝试使用 UTC 的纪元时间进行搜索:

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
calendar.clear();
calendar.set(2021, Calendar.DECEMBER, 25);
long secondsSinceEpoch = calendar.getTimeInMillis() / 1000L; // 1640390400

在这里,对于直接 gmail.com 搜索和 java 搜索,我得到了相同的结果:消息 7(下午 1 点)表示“after:1640390400”和 1-6 表示“before:1640390400”。

如果我为 PST (1640419200) 尝试此操作,我不会收到“after:1640419200”的消息,而所有消息都是“before:1640419200”的消息。

【问题讨论】:

根据我在documentation 中看到的内容,您可以使用与Gmail 搜索框格式相同的q。您可以检查消息是否在这种情况下出现?考虑到Gmail 将时间存储为 UTC,然后将其转换为您的本地时间。 如果您还检查负载中的Date 标头会很有帮助。 @Emel 我使用 q 进行查询;我用更多信息更新了我原来的问题。 【参考方案1】:

正如documentation 所说:

要指定其他时区的准确日期,请改为以秒为单位传递值。

这是一个 Java 示例代码,经过测试并且可以工作。对于该示例,我收到了从昨天 23:00 到今天 13:00 的所有消息。 提示:您可以使用me 作为电子邮件帐户的关键字:

long startTimeEpoch = LocalDateTime.parse("2021-12-27T23:00",
    DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm")).toEpochSecond(ZoneOffset.UTC);
long endTimeEpoch = LocalDateTime.parse("2021-12-28T13:00",
    DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm")).toEpochSecond(ZoneOffset.UTC);
String query = String.format("after:%s before:%s", startTimeEpoch, endTimeEpoch);
String account = "me";
System.out.println(query);
List < String > labelIds = new ArrayList < > ();
labelIds.add("Label_mylabelid");
List < Message > timeZoneMsgs = service.users().messages().list(account)
    .setQ(query)
    .execute()
    .getMessages();
System.out.println(timeZoneMsgs);
文档:
Gmail API Javadoc documentation LocalDateTime DateTimeFormatter

【讨论】:

因此,如果 Gmail 以 UTC 存储时间,并且我希望所有电子邮件都从例如26.12.2021 它应该是:long startTimeEpoch = LocalDateTime.parse("2021-12-26T00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm")).toEpochSecond(ZoneOffset.UTC) ; --> 1640476800 如果我使用它,我只会收到从 26.12.2021 01:00am 开始的电子邮件,而不是 00:00am ... 啊没关系..那是我的错。我的时区中的 26.12.2021 00:00 是 UTC 中的 25.12.2021 23:00。因此,要使用正确的帐户时区,我显然应该根据 ***.com/questions/18325906/… 通过日历 api 获取它。谢谢!

以上是关于GMAIL API - 日期搜索(时区不清楚)的主要内容,如果未能解决你的问题,请参考以下文章

Gmail REST API 线程搜索未给出预期结果

无法使用 Gmail API 中的高级搜索来搜索特定的彩色星(超级星)。

在 Python 中使用 Gmail API 使用 message-id 搜索电子邮件

PHP,Codeigniter:如何在Web应用程序中根据用户时区/位置设置日期/时间?

在java中按提供的时区格式化日期[重复]

Netsuite:保存的搜索公式:显示具有最早的自定义日期的不同行