在 Google Tasks API 中使用 Joda-Time 库将字符串转换为日期时间格式

2023-12-03

我有一个日期/时间字符串需要发送到 Google Tasks API,但我不知道如何转换乔达时间图书馆DateTime对象转换为 Java DateTime 对象。我使用 Android 作为平台。

该字符串以“2012/07/19 22:00:00”开头,首先转换为 Iso 格式。

这是我的代码:

    Task task = new Task();
    task.setTitle(title);
    task.setNotes(note);        
    DateTimeFormatter formatter =  DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss");
    DateTime dt = formatter.parseDateTime(dateToIso("2012/07/19 22:00:00"));
    task.setDue(dt);    

private String dateToIso(String date) {
    date = date.replace("/", "-");
    date = replaceCharAt(date, 10, 'T');
    date = date + ".000Z";
    return date;
}

我收到的错误是:

“类型不匹配:无法从 org.joda.time.DateTime 转换为 com.google.api.client.util.DateTime"

请协助。有关 ISO 转换的信息也很有用。


让格式化程序解析字符串

问题是你的“dateToIso”方法。没必要这样。这日期时间格式化程序对象的工作是在给定正确的格式时解析字符串。您确实给出了正确的格式。然后你将字符串转变为不同的格式!

解决方案: (a) 终止 dateToIso 方法。 (b) 删除对该方法的调用。只需将原始字符串传递给parseDateTime.

附带问题:您忽略了时区问题。因此,在解析该字符串时,Joda-Time 将假设该日期时间事件发生在 JVM 的默认时区。因此,使用相同的输入但在具有不同时区设置的另一台计算机/JVM 上运行相同的代码将导致不同的输出。可能不是你想要的。经验教训:始终指定时区而不是依赖默认值。

还有另一个问题:您引用的错误是一个不同的问题,从 Joda-Time 转换为 Google 时间。请继续阅读。

阅读文档

如果您正在尝试转换您的org.joda.time.DateTime反对com.google.api.client.util.DateTime对象,只需查看JavaDoc。在那里您将看到 Google DateTime 的构造函数采用 java.util.Date。 Joda-Time 有一个内置的toDate方法转换为 java.util.Date 对象以与其他类进行互操作。

食物链

创建一个像这样的对象食物链:

org.joda.time.DateTime → java.util.Date → com.google.api.client.util.DateTime

一些未经测试的代码...

org.joda.time.DateTimeZone = org.joda.time.DateTimeZone.forID( "Africa/Johannesburg" );
org.joda.time.DateTime jodaDateTime = new DateTime( timeZone );

// Convert from Joda-Time to old bundled j.u.Date
java.util.Date juDate = jodaDateTime.toDate();

// Convert from j.u.Date to Google Date.
com.google.api.client.util.DateTime googleDateTime = new com.google.api.client.util.DateTime( juDate );

毫秒

或者,您可以提取并传递毫秒。

一般来说,我建议尽可能避免直接处理毫秒。使用毫秒可能会造成混乱、草率且容易出错。毫秒计数很难调试,因为人类无法轻易破译日期时间的含义long。而 Joda-Time 和 java.util.Date 使用 UNIX 纪元以来的毫秒数作为其内部时间跟踪机制......

  • 部分软件使用seconds or 纳秒而不是毫秒。
  • 有些软件使用其他epochs而不是Unix时代.

走向另一个方向

[以下部分假设 Google 已用更新的 API 取代了问题引用的 API。不确定这个假设是否正确。]

当从一个com.google.gdata.data.DateTime对象 Joda-Time DateTime,我会使用由getValue方法。请注意,它返回的是 64 位long,而不是 32 位int.

确保将所需的时区分配给 Joda-TimeDateTime而不是依赖于隐式分配 JVM当前默认时区.

long millisecondsFromUnixEpoch = myGoogleDateTime.getValue();
org.joda.time.DateTimeZone zone = DateTimeZone.forID( "Africa/Johannesburg" );
org.joda.time.DateTime jodaDateTime = new DateTime( millisecondsFromUnixEpoch, zone );

Google API 提供了一些其他选择。

toStringRfc822

您可以致电toStringRfc822方法生成一个由 Joda-Time 解析的字符串。不幸的是,RFC 822 解析起来很尴尬且含糊不清。除其他错误外,它使用非标准非唯一的 3-4 字母时区代码而不是正确的时区名称。由于这些代码含糊不清,Joda-Time 拒绝尝试解析这些代码。我假设 Google 将其包含在这里只是为了向后兼容旧的 API/库。现代互联网协议已转向 ISO 8601。

toUiString

也许你可以打电话给toUiString方法创建一个由 Joda-Time 解析的字符串。不幸的是,他们的文档未能解释该方法使用什么格式。

toString

您可以致电toString被记录为产生的方法xs:dateTime细绳。该文档未能准确解释,但我猜他们的意思是XML 架构规范包含 ISO 8601。您可以尝试此方法来查看它会生成什么。如果您想保留嵌入在 Google 对象中的 UTC 偏移量,它可能会很有用。但请记住,时区不仅仅是 UTC 的偏移量,因此您仍然应该将所需/预期的时区分配给 Joda-Time DateTime 对象。因此,我不确定这是否比仅仅通过longcount-from-epoch 到 Joda-Time DateTime 的构造函数。

java.time

现在Java 8发布后,也许 Google 可能会对其 API 进行现代化改造以使用java.time包.

请注意,java.time 扩展了 ISO 8601 格式以附加时区的正式名称,这是一个非常有用的想法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Google Tasks API 中使用 Joda-Time 库将字符串转换为日期时间格式 的相关文章

  • 活动丢失后终止异步任务

    这是我的过程和问题 在此应用程序中 您单击菜单按钮 在此菜单中 您按下切换按钮 该按钮将启动异步任务 每 30 秒发出一次提示音 该任务是在选中切换时持续运行 并在取消选中时取消 只要您留在菜单窗口中 就可以启动和停止该过程 检查切换框 如
  • Java setLocation() 事故

    我正处于创建一个程序来操作员工 客户系统的开始阶段 现在我刚刚创建了登录 GUI 但我遇到了一些问题 setLocation 方法 我将其设置为 250 250 但这使我的 GUI 高度变得非常疯狂 如果有人能够解决这个问题 我的代码如下
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 帮助我将以十六进制表示的长值转换回日期/时间

    我有一个日期值 据说它是 8 个字节 一个 long 又名 int64 值 并转换为十六进制 60f347d15798c901 我如何使用 PHP 将这个和类似的值转换为时间 日期 将其转换为十进制给我 96 243 71 209 87 1
  • c3p0 Java 数据库池、故障转移配置

    当数据库关闭时 IP 和端口会自动切换到另一个数据库服务器 我应该如何配置 Web 应用程序的 c3p0 连接池以遵循此数据库故障转移机制 目前 我使用的是 c3p0 但是在上次数据库故障转移中 池连接无法重新建立 请求失败后重新建立 有助
  • 如何在连接到远程系统的设备上部署和执行应用程序?

    我需要部署测试应用程序并在连接到同一网络中另一台计算机的设备上发出命令 我通读了http developer android com tools help adb html directingcommands http developer
  • 如何实现 Android 浮动 SearchWidget

    I am trying to implement the search widget in the current android apps but just can t get it done and I ve not been able
  • Android:RecyclerView 项目上下文菜单问题

    我正在尝试实现一个 RecyclerView 单击每个项目时 都会弹出一个上下文菜单 我已引用此的答案 评论question https stackoverflow com questions 26466877 how to create
  • JSch:如何使用 ssh 密钥 ssh 到服务器

    我想从另一个 ssh 服务器后面 ssh 进入服务器 网关服务器需要用户名 密码 我可以做到这一点 我正在使用隧道进入下一台服务器 但这需要only一个 ssh 密钥 我已经通过 PuTTY 生成了密钥 因此它存在于我的用户名中 但我不确定
  • Java 8 中函数类型全等 lambda 表达式的用法

    我对 的定义和用法感到困惑 Stream collect Supplier
  • 使用 GSON 将 JSON 字符串转换为 Java 对象

    我正在尝试将 json 解析为 java 根据 jsonlint com 我有以下字符串 该字符串是有效的 json private final static String LOC JSON lat1 39 737567 lat2 32 7
  • 使用 testcontainer 作为 Dockerfile 的一部分运行测试

    我的 dockerfile 看起来像这样 FROM maven 3 jdk 11 slim COPY pom xml COPY src src RUN mvn clean install 这意味着构建的一部分是单元测试的执行 一些单元测试使
  • 不同的 IntentServices 可以并行运行吗?

    我有点难以理解有关 IntentServices 的一条规则 From 创建后台服务 https developer android com training run background service create service ht
  • Java 需要一个 FileSet 包/类

    任何人都可以建议 Java 中的 FileSet 包 类吗 我所说的 FileSet 是指文件和目录的集合以及正则表达式支持的包含和排除规则 类似于 Apache Ant 谢谢 Apache 公共 IO文件工具 http commons a
  • Jersey:返回字符串列表

    我尝试以 JSON 和 XML 形式返回 Jersey 中的字符串列表 我以为这会是微不足道的 我的第一次尝试是写这样的东西 GET Produces MediaType APPLICATION JSON MediaType APPLICA
  • 解析 onPushOpen 从未被调用

    我已经使用解析实现了推送 将参数添加到清单文件中
  • java银行程序帐户ID不上去?

    每次创建银行帐户时 帐户 ID 都应增加 1 但每次我尝试提取 Id 时 我只会得到帐户 ID 为 0 任何建议 因为我完全按照我学习的书中的方式进行操作而且它仍然没有更新 帐户构造函数 public class BankAccount p
  • 如何从项目文件夹中的 jlabel 上设置图像?

    我正在尝试制作一个 Java 桌面应用程序 我想设置一个图像JLabel 我正在使用 NetBeans 从我的项目文件夹中 我的目录结构是 F gt MARKET src lib src defaultpackage demo java i
  • Android 中的定制数字时钟

    您好 我想以 HH mm AM PM 的格式在我的应用程序中显示时间 数字时钟还包括秒 即 HH mm ss 上午 下午 如何避免显示秒 有没有什么可行的办法 请帮助我 您必须克隆该文件DigitalClock java要在您的应用程序中使
  • 应用程序中 GC 长时间暂停

    我当前运行的应用程序需要最大堆大小为 16GB 目前我使用以下标志来处理垃圾收集 XX UseParNewGC XX UseConcMarkSweepGC XX CMSInitiatingOccupancyFraction 50 XX Di

随机推荐