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

GMAIL API - Date search (timezone unclear)

根据 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:30pm 和 01:00am 之间发送一些电子邮件。

以下是消息的日期 headers(直接从负载中提取):

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 调用执行相同操作时,我只收到“after:2021/12/25”的消息 7(凌晨 1 点)和“before:2021/12”的消息 1-6 /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 搜索得到相同的结果:“after:1640390400”的消息 7(下午 1 点)和“before:1640390400”的消息 1-6。

如果我为太平洋标准时间 (1640419200) 尝试此操作,我没有收到“after:1640419200”的消息以及“before:1640419200”的所有消息。

正如 documentation 所述:

To specify accurate dates for other timezones pass the value in seconds instead.

这是一个 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);
文档: