flutter 如何在抖动中用时区的思想将Date对象解析为ISO8601字符串?

8qgya5xd  于 2023-02-25  发布在  Flutter
关注(0)|答案(1)|浏览(137)

我正在尝试调用一个API,其主体包含JST时区的ISO8601字符串。
首先,我有一个这个对象的示例:

class SearchUser {
  final String   firstName;
  final String   lastName;
  final DateTime birthday;
  ... // constructor
  Map<String, dynamic> toJson() => {
    "firstName" : firstName,
    "lastName"  : lastName,
    "birthday"  : birthday.toLocal().toIso8601String()
  };
}

我使用上面写的toJson方法在这个API中将其编码为json:

class userApi {
  Future<dynamic> searchUser(SearchUser searchUser) async {
    final url = Uri.parse('$baseUrl/user/search');
    try {
      final Map<String, String> headers = {"content-type" : "application/json"};
      final body = jsonEncode(searchUser.toJson());
      final res  = await http.post(url, headers : headers, body : body);
      ...
    }
  }
}

然后,举个例子,假设我为body设置了这个值:{"birthday":"2023-02-21T00:00:00.000","firstName":"John","lastName":"White"}.
但是,在我的后端(用TypeScript编写)中,new Date(body.birthday)的输出将如下所示:

2023-02-20T15:00:00.000Z

我该怎么做才能消除这个差距?

7kqas0il

7kqas0il1#

2023年2月21日00:00 JST * 为 * 2023年2月20日15:00 UTC,没有间隔;这是同一时刻的两种表示。
您的服务器似乎以UTC存储时间。当您的客户端发送本地时间“2023-02-21 00:00 JST”时,如果您希望您的服务器存储“2023-02-21 00:00 UTC”并且不执行任何时区转换,那么您的客户端应该首先发送一个UTC时间以及您想要的年/月/日等值。Dart 2.19添加了一个copyWith extension method on DateTime,使之更容易:

birthday.toLocal().copyWith(isUtc: true)

相反,当您从服务器获取UTC时间时,可以将其视为本地时间,而无需使用以下命令执行时区转换:

DateTime.parse(timestampFromServer).copyWith(isUtc: false)

相关问题