将日期/时间解析为本地时区

2024-01-17

我正在尝试从服务器端绑定视图持有者解析日期/时间 json。 我试图解析的日期字符串是这样的:

2018-06-25T08:06:52Z

这是我正在使用的代码(从另一个堆栈溢出线程获取它)

  try {


           SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH);
           df.setTimeZone(TimeZone.getTimeZone("Africa/Nairobi"));
           Date date = df.parse(timeToConvert);
           df.setTimeZone(TimeZone.getDefault());
           String formattedDate = df.format(date);
           String trimmed = formattedDate.substring(11,16);
           myViewHolder.date_TV.setText(trimmed);

       }catch (Exception e){

       }

然而这不起作用,文本视图中设置的时间与解析之前相同。


    String timeToConvert = "2018-06-25T08:06:52Z";
    Instant inst = Instant.parse(timeToConvert);
    LocalTime time = inst.atZone(ZoneId.of("Africa/Nairobi"))
            .toLocalTime()
            .truncatedTo(ChronoUnit.MINUTES);
    System.out.println("Time in Nairobi: " + time);

这打印:

内罗毕时间:11:06

我在用java.time,在本例中是向后移植到 Java 6 和 7。此向后移植也可在 Android 版本中使用,您可以将其用于较低的 Android API 级别。我的进口是:

import org.threeten.bp.Instant;
import org.threeten.bp.LocalTime;
import org.threeten.bp.ZoneId;
import org.threeten.bp.temporal.ChronoUnit;

如果您需要需要此格式的 API 的时间字符串,那就没问题。如果您需要向用户展示时间字符串,请考虑使用 Java 的内置格式:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
    ZonedDateTime dateTime = inst.atZone(ZoneId.of("Africa/Nairobi"));
    System.out.println("Formatted: " + dateTime.format(timeFormatter));

我尝试在斯瓦希里语(sw_KE)语言环境中运行它并得到:

格式:上午 11:06

显然,这个语言环境使用英语 AM/PM 方式来表示时间(我在基库尤语和卡伦津语语言环境中得到了相同的结果)。在英国语言环境中,我得到与以前相同的格式:

格式:11:06

我正在使用和建议java.time,现代 Java 日期和时间 API。对于任何阅读并使用 Java 8 或更高版本或针对 Android API 级别 26 或更高级别进行编程的人,您不需要提到的向后移植。只需从以下位置导入内置的日期时间类java.time用子包代替上面提到的。

你的代码出了什么问题?

您的错误来自硬编码Z在日期时间字符串中作为文字。它的 UTC 偏移量为零,当您不这样解析它时,日期时间字符串将在您所在的时区进行解析SimpleDateFormat, Africa/Nairobi,这对于您的字符串来说是不正确的。

恕我直言,你不应该想使用SimpleDateFormat, TimeZone and Date但无论如何。这些类早已过时,尤其是第一个类已被证明很麻烦。我总是用java.time反而。

另一个提示:不要接受异常。不要离开你的catch块空。以某种明显的方式报告异常。这是您发现代码中何时出现问题的机会。

Links

  • Oracle 教程:日期时间 https://docs.oracle.com/javase/tutorial/datetime/解释如何使用java.time.
  • Java 规范请求 (JSR) 310 https://jcp.org/en/jsr/detail?id=310, where java.time首次被描述。
  • ThreeTen 后移植项目 http://www.threeten.org/threetenbp/,向后移植java.time到 Java 6 和 7(JSR-310 为 ThreeTen)。
  • 三十ABP https://github.com/JakeWharton/ThreeTenABP, Android 版 ThreeTen Backport
  • 问题:如何在Android项目中使用ThreeTenABP https://stackoverflow.com/questions/38922754/how-to-use-threetenabp-in-android-project,有非常详尽的解释。
  • 维基百科文章:ISO 8601 https://en.wikipedia.org/wiki/ISO_8601
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将日期/时间解析为本地时区 的相关文章

随机推荐

  • 在合并和推送之前强制分支重新设置基础

    我想在我的 Gitlab 服务器上添加一个钩子 以防止在 master 上推送合并的分支 如果它们之前没有重新建立基础 例如 A B C D master E F G new feature 我希望用户在合并 推送之前重新调整他的功能 A
  • jQuery td onclick 设置复选框,不冒泡

    我希望能够单击表中的 td 元素 并让它选中或取消选中同一行上同级 td 中的复选框 单击该复选框仍应 工作正常 单击 td 复选框所在的元素 还应该选中该复选框 单击不同的 td 不应该 需要双击 重置单击 由于切换实施不当 Fiddle
  • 使用指令 Angular 2 更改输入的 ngModel 值

    我不知道如何访问和更改输入ngModel使用指令的值 问题的结果是 当我选择所需的地址时 模型的地址值不会更新 它只是设置为我实际在输入中输入的内容 而不是输入的最终值 我输入 830 我选择 8300 Fauntleroy Way Sou
  • rspec:未找到属性(存在)错误

    我在指定模型验证时遇到一些问题 该模型充当状态机 gem state machine 0 9 4 通过 stat machine 我定义了对交付状态下的自行车的验证 state delivered do validates presence
  • 在两个 Angular2 组件打字稿文件之间传递值

    我有两个不是父组件和子组件的组件 但我需要将值从组件 A 传递到组件 B example src abc cde uij componentA ts 具有变量 CustomerId ssss 需要将该变量 customerID 传递给 sr
  • 排除 Maven/Intellij Idea 项目中的日志文件夹

    我有一个与我的项目和 Intellij Idea 处于同一级别的 日志 目录 我可以从 Idea 打开这些日志 此目录中的文件有几场演出 因此当我尝试在项目中搜索字符串时 它会导致一分钟左右的搜索 而我希望它是即时的 所以我在 Idea 中
  • TFS 构建:以管理员身份运行构建

    我们有一个构建项目可以修改构建计算机上的注册表 不要问我为什么 并且需要以管理员身份完成 有没有办法以 管理员 身份从构建代理运行 msdev 我们正在使用 TFS 2012 很快就会迁移到 TFS 2013 布鲁斯 将构建服务帐户添加到本
  • Android 用自定义可绘制选择器替换复选框样式

    我尝试使用以下内容创建 xml 选择器
  • Android:当我滚动时 OnbindViewHolder 不会调用

    嗨 当我遇到一个奇怪的问题时recyclerview创建第一次OnbindViewHolder调用直到最后一项recyclerview然后当我滚动时OnbindViewHolder未调用我需要解决这个问题 因为我需要使用分页 但是当使用它时
  • 如何将变更集保留在 hg 推送的“草稿”阶段?

    我如何阻止 Mercurial 将变更集置于推送操作的 公开 阶段 我希望他们保持 草案 我经常进行 rebase 和 histedit 并且我推送到的存储库仅供我使用 而且必须一直改变相位是一件很麻烦的事 文档没有明确揭示的是 推送上的相
  • SQLServer 如何向 vb.net 应用程序通知事件?

    有没有一种相对简单的方法可以通知我的 VB NET 应用程序新值已写入 SQL Server Express 2008 中的表 轮询不是一种选择 因为我需要每 10 秒不间断地进行一次轮询 看看让您的应用程序订阅查询通知 http msdn
  • 函数不会在关闭完成块中触发

    所以我有一个视图控制器 当用户登录时它会被关闭 在关闭函数完成块中 我触发了一个应该重新加载下一个视图控制器的函数 什么也没发生 空白视图控制器 但是 如果我在登录后关闭应用程序 然后重新打开它 一切都会按预期加载 这是我的登录功能 fun
  • 如何在 Visual Studio 中为自定义配置文件添加配置转换?

    我正在从事的项目涉及从配置文件读取大量服务端点 url 由于列表相当大 我决定将它们保存在自定义配置文件中 以保持我的 web config 干净且小 我将自定义部分添加到我的网站中 如下所示
  • Active Directory LDAP 查询结果始终缺少已知存在的属性

    这是我目前遇到的一个问题 用户个人资料有一个属性 EmployeeID 当使用以下命令查看该用户时会出现该属性广告浏览器 http technet microsoft com en us sysinternals bb963907 aspx
  • HTML5 离线应用程序缓存更新未在 Firefox 中显示

    我的文档根目录中有一个index php 文件 它产生以此开头的输出 manifest appcache 告诉浏览器缓存它以供离线使用 再次 相关部分 CACHE MANIFEST version 8 25 2011 CACHE inter
  • 无法在 call.enqueue 的 for 循环之外获取 ArrayList

    我想从 Retrofit 中的 call enqueue 方法中获取 ArrayList 数据 如何访问 call enqueue 方法之外的列表 一切正常 当打印列表大小时 我得到了我想要的值 唯一的问题是我无法从 call enqueu
  • 在 Swift 中设置带有边距的 UITableViewCell 框架

    我正在尝试制作一个具有左右边距 插图的 UITableViewCell 我过去曾使用 Objective C 使用以下代码完成此操作 void setFrame CGRect frame frame origin x 25 frame si
  • 使用 C++ 11 进行重构

    鉴于 c 提供的新工具集 许多程序员以代码简化 表现力 效率为目标 浏览旧代码并进行调整 有些毫无意义 有些成功 以实现他们的目标 虽然尽量不要在此类工作上浪费太多时间 而只是进行非侵入性且独立的更改 但最佳实践是什么 让我划掉显而易见的部
  • instanceof 检测接口时产生不一致的结果?

    有什么棘手的事情我应该知道吗instanceof 我通过一些方法传递对象列表 并使用以下方法测试这些对象是否实现特定接口instanceof 在某些情况下 instanceof正确地将对象识别为实现接口 但在其他情况下则不然 它似乎在不同地
  • 将日期/时间解析为本地时区

    我正在尝试从服务器端绑定视图持有者解析日期 时间 json 我试图解析的日期字符串是这样的 2018 06 25T08 06 52Z 这是我正在使用的代码 从另一个堆栈溢出线程获取它 try SimpleDateFormat df new