当前位置: 首页 > news >正文

Sharepoint Graph API Edm.DateTimeOffset 类型格式

在 **Microsoft Graph API** 中,`Edm.DateTimeOffset` 类型(如 `lastModifiedDateTime`、`createdDateTime`)的格式与 SharePoint REST API **完全不同**。

### 1. 核心区别对比

| 特性 | **Microsoft Graph API** | **SharePoint REST API** |
| :--- | :--- | :--- |
| **URL 特征** | `graph.microsoft.com` | `/_api/` |
| **字段名称** | `lastModifiedDateTime` | `Modified` |
| **datetime 前缀** | ❌ 不需要 | ✅ 必须 (`datetime'...'`) |
| **单引号** | ❌ 不需要 | ✅ 必须 (`'...'`) |
| **时间格式** | `2025-02-27T15:05:58Z` | `datetime'2025-02-27T15:05:58Z'` |
| **URL 编码** | 空格需 `%20` | 空格需 `%20`,**单引号不能编码** |

---

### 2. Graph API 正确格式示例

**标准格式:**
```text
YYYY-MM-DDTHH:MM:SSZ
```

**正确的 Filter 查询:**
```http
GET https://graph.microsoft.com/v1.0/drives/{drive-id}/items/{item-id}/children?$filter=lastModifiedDateTime ge 2025-02-27T15:05:58Z
```

**URL 编码后:**
```http
?$filter=lastModifiedDateTime%20ge%202025-02-27T15:05:58Z
```

> **注意**:Graph API 中时间值**不需要单引号**,所以不存在单引号编码问题。

---

### 3. 正确与错误示例对照

| 场景 | ✅ 正确写法 | ❌ 错误写法 | 错误原因 |
| :--- | :--- | :--- | :--- |
| **标准 UTC 时间** | `2025-02-27T15:05:58Z` | `datetime'2025-02-27T15:05:58Z'` | Graph API 不需要 `datetime` 前缀和单引号 |
| **带时区偏移** | `2025-02-27T15:05:58+08:00` | `2025-02-27T15:05:58` | 缺少时区标识 (`Z` 或 `+xx:xx`) |
| **URL 中的空格** | `lastModifiedDateTime%20ge%202025...` | `lastModifiedDateTime+ge+2025...` | 空格应编码为 `%20` |
| **字段名称** | `lastModifiedDateTime` | `Modified` | Graph API 用 `lastModifiedDateTime` |
| **单引号** | 无单引号 | `'2025-02-27T15:05:58Z'` | Graph API 时间值不需要单引号 |

---

### 4. Java 代码示例 (Microsoft Graph API)

#### 4.1 生成 UTC 时间字符串

```java
import java.time.ZonedDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class GraphDateTimeExample {
public static void main(String[] args) {
// 获取当前 UTC 时间
ZonedDateTime utcNow = ZonedDateTime.now(ZoneOffset.UTC);

// 格式化为 ISO 8601 (带 Z)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
String utcString = utcNow.format(formatter);

System.out.println("Graph API 时间格式:" + utcString);
// 输出:2025-02-27T15:05:58Z
}
}
```

#### 4.2 构建 Filter 查询 (完整可运行)

```java
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.ZonedDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class GraphApiDateTimeQuery {
public static void main(String[] args) throws Exception {
String driveId = "YOUR_DRIVE_ID";
String itemId = "YOUR_ITEM_ID";
String accessToken = "YOUR_ACCESS_TOKEN";

// 1. 生成 UTC 时间字符串
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
String utcTime = ZonedDateTime.now(ZoneOffset.UTC).format(formatter);

// 2. 构建 Filter (Graph API 不需要 datetime 前缀和单引号)
String filterValue = "lastModifiedDateTime ge " + utcTime;

// 3. URL 编码 (只需处理空格,不需要处理单引号)
String encodedFilter = URLEncoder.encode(filterValue, StandardCharsets.UTF_8.toString())
.replace("+", "%20");

// 4. 拼接完整 URL
String fullUrl = String.format(
"https://graph.microsoft.com/v1.0/drives/%s/items/%s/children?$filter=%s&$top=10",
driveId,
itemId,
encodedFilter
);

// 5. 调试输出
System.out.println("请求 URL: " + fullUrl);
// ✅ 应看到:...lastModifiedDateTime%20ge%202025-02-27T15:05:58Z...
// ❌ 不应看到:...datetime'...' 或 ...%27...

// 6. 发送请求
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(fullUrl))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json")
.GET()
.build();

HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println("状态码:" + response.statusCode());
System.out.println("响应体:" + response.body());
}
}
```

---

### 5. 常见操作符示例

| 操作符 | 含义 | URL 示例片段 |
| :--- | :--- | :--- |
| `gt` | 大于 | `lastModifiedDateTime gt 2025-01-01T00:00:00Z` |
| `ge` | 大于等于 | `lastModifiedDateTime ge 2025-01-01T00:00:00Z` |
| `lt` | 小于 | `lastModifiedDateTime lt 2025-12-31T23:59:59Z` |
| `le` | 小于等于 | `lastModifiedDateTime le 2025-12-31T23:59:59Z` |
| `eq` | 等于 | `lastModifiedDateTime eq 2025-02-27T15:05:58Z` |
| `and` | 与 | `lastModifiedDateTime ge 2025-01-01T00:00:00Z and lastModifiedDateTime le 2025-12-31T23:59:59Z` |

**范围查询示例 (Java):**
```java
String filterValue = "lastModifiedDateTime ge 2025-01-01T00:00:00Z and lastModifiedDateTime le 2025-12-31T23:59:59Z";
```

---

### 6. 使用 Microsoft Graph SDK (推荐)

如果你使用官方 SDK,时间格式会自动处理:

```java
import com.microsoft.graph.drives.item.items.item.children.ChildrenRequestBuilder;
import java.time.OffsetDateTime;

// SDK 会自动处理格式和编码
ChildrenRequestBuilder.ChildrenRequestBuilderGetQueryParameters queryParams =
new ChildrenRequestBuilder.ChildrenRequestBuilderGetQueryParameters();
queryParams.filter = "lastModifiedDateTime ge " + OffsetDateTime.now(ZoneOffset.UTC).toString();

// 执行请求
var response = graphClient.drives().byDriveId(driveId).items().byDriveItemId(itemId).children().get(requestConfig -> {
requestConfig.queryParameters = queryParams;
});
```

---

### 7. 浏览器快速验证

复制以下 URL 到浏览器测试(需先获取 Token):

```
https://graph.microsoft.com/v1.0/drives/{drive-id}/items/{item-id}/children?$filter=lastModifiedDateTime ge 2025-01-01T00:00:00Z&$top=5
```

* ✅ **返回 JSON** → 格式正确
* ❌ **报错** → 检查字段名、时间格式、Token 权限

---

### 8. 总结检查清单

| 检查项 | ✅ Graph API 正确 | ❌ 常见错误 |
| :--- | :--- | :--- |
| **字段名** | `lastModifiedDateTime` | `Modified` |
| **datetime 前缀** | 无 | `datetime` |
| **单引号** | 无 | `'...'` |
| **时区标识** | `Z` 或 `+08:00` | 无 |
| **空格编码** | `%20` | `+` |
| **Accept Header** | `application/json` | 缺失 |

---

### 9. 两种 API 格式对比总结

```
┌─────────────────────────────────────────────────────────────────┐
│ SharePoint REST API │
│ $filter=Modified ge datetime'2025-02-27T15:05:58Z' │
│ ⚠️ 需要 datetime 前缀 + 单引号,单引号不能 URL 编码 │
└─────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────┐
│ Microsoft Graph API │
│ $filter=lastModifiedDateTime ge 2025-02-27T15:05:58Z │
│ ✅ 不需要 datetime 前缀,不需要单引号 │
└─────────────────────────────────────────────────────────────────┘
```

按照以上格式构建 Graph API 请求,即可避免类型不匹配的错误。

http://www.jsqmd.com/news/466281/

相关文章:

  • 天津施德科技有实力吗,2026年工业自动化服务企业推荐哪家 - 工业品牌热点
  • 高速互连信号完整性解析:带宽、损耗、干扰与匹配
  • OpenClaw免费自动部署脚本-docker版
  • 网络安全是黄金赛道吗?2026年行业真相:缺口480万,薪资24万,小白入行指南
  • 普通三相异步电动机如何改单相?
  • Oozie任务失败告警机制
  • 2026年比较好的气膜料棚工厂推荐:气膜仓库/气膜体育馆专业制造厂家推荐 - 行业平台推荐
  • 西门子200 SMART与昆仑通态锅炉换热站程序实例:模拟量读取、自动切换与Modbus通讯控制
  • 基于RF随机森林机器学习算法的回归预测模型MATLAB代码 基于RF随机森林机器学习算法的回归预测模型MATLAB代码实现了一个回归任务的决策树集成模型。
  • 2026四川省债权维护与经济纠纷防范白皮书:五大实战派律所与精英律师推荐 - 博客万
  • A代码的一部分,B代码又含有A类型属性 这就是一个编译死循环 . 其他循环引用的例子 链表结构只有一个类型也是类型循环引用 A-B- ...
  • 医美填充好学吗?从0到1,新手学填充的完整路径拆解
  • 2026年肇庆地区锅炉安装公司怎么收费,大型公司全梳理 - mypinpai
  • PMOS NMOS 导通条件(增强型,最常用)
  • 车载摄像头接口ESD二极管选型推荐
  • 2026运维监控选型大揭秘:谁能成为全栈观测需求的“天选之系”?
  • 2026安徽正微网络产品怎么样,使用费用多少钱 - 工业推荐榜
  • 1.10 面试经典150题-多数元素
  • 机器人同步效果好吗?现场演示触发
  • OAuth2.0实现单点登录的原理流程,这次总该懂了!
  • Spring开发系列教程(31)——集成JMX
  • 计算机毕业设计源码:Python双协同过滤商品推荐系统 Django框架 协同过滤算法 requests爬虫 算法优化 深度学习 大数据 数据分析 可视化 大模型(建议收藏)✅
  • 工业机器人视觉系统配置与调试完全指南:从硬件选型到实战应用
  • 内核态用户态
  • 收藏!小白程序员必看:用上下文工程解锁大模型准确性与创造力的平衡点
  • 2026年3月不锈钢抛丸型材设计,口碑好的都在这个排行榜单里,不锈钢抛丸六角管,不锈钢抛丸型材厂商口碑推荐 - 品牌推荐师
  • JavaScript全栈性能调优实战指南
  • 长时间火车无座必带物品
  • 2026内热针小针刀设备优质品牌推荐指南:内热针刃针/内热针厂家/内热针治疗仪/内热针芒针/筋膜内热针/中华内热针/选择指南 - 优质品牌商家
  • Linux .so 动态库:底层原理