java joda 获取utc时间_java – 使用JodaTime以毫秒为单位的UTC到本地时间
我试图使用Jodatime显示特定时间段内的交易.
我们的服务器要求开始日期和结束日期为UTC(这可能是显而易见的).因此,围绕它们的任何业务逻辑都使用DateTime对象,时区设置为DateTimeZone.UTC,例如,
mStartDate = DateTime.now(UTC).withTimeAtStartOfDay();
除了显示我不知道如何为本地(系统默认)时区增加它的时间之外,这很有效.理想情况下,我想使用传递两个本地时间戳的DateUtils formatDateRange函数.但getMillis()函数似乎不考虑本地偏移:
我也试过这个:
mTimePeriodTitle.setText(DateUtils.formatDateRange(mContext, f, mStartDate.getMillis(),
mEndDate.getMillis(), DateUtils.FORMAT_SHOW_TIME,
TimeZone.getDefault().getID()).toString());
但它没有任何区别.所以我的问题是如何获得具有2个UTC时间戳的格式良好的本地日期范围?
解决方法:
如果您的DateTime是UTC并且您想将其转换为另一个时区,则可以使用withZone方法进行转换.
对于下面的示例,我的默认时区是America / Sao_Paulo(您可以使用DateTimeZone.getDefault()检查您的时区):
// create today's date in UTC
DateTime mStartDate = DateTime.now(DateTimeZone.UTC).withTimeAtStartOfDay();
// date/time in UTC
System.out.println(mStartDate); // 2017-06-13T00:00:00.000Z
// date/time in my default timezone (America/Sao_Paulo)
System.out.println(mStartDate.withZone(DateTimeZone.getDefault())); // 2017-06-12T21:00:00.000-03:00
输出是:
2017-06-13T00:00:00.000Z
2017-06-12T21:00:00.000-03:00
请注意,withZone方法正确地将日期和时间转换为我的时区(在America / Sao_Paulo中,当前偏移量为UTC-03:00),因此进行了相应调整.
如果您想获得时间(小时/分钟/秒),可以使用toLocalTime()方法:
System.out.println(mStartDate.withZone(DateTimeZone.getDefault()).toLocalTime()); // 21:00:00.000
输出是:
21:00:00.000
如果您想要其他格式(例如,不打印秒数的3位数),则可以使用DateTimeFormatter.好处是您可以在格式化程序中设置时区,因此您无需转换DateTime:
// create formatter for hour/minute/second, set it with my default timezone
DateTimeFormatter fmt = DateTimeFormat.forPattern("HH:mm:ss").withZone(DateTimeZone.getDefault());
System.out.println(fmt.print(mStartDate)); // 21:00:00
输出是:
21:00:00
要获得范围,可以使用上述方法之一和DateTime(mStartDate和mEndDate),并使用DateTimeFormatter更改为您需要的任何格式.
PS:我认为你在使用getMillis()时缺少的是日期时间(UTC和默认时区)代表同一时刻.你只是将这一瞬间转换为当地时间,但毫秒是相同的(想想,此时此刻,世界上的每个人都处于同一时刻(相同的毫秒),但他们的当地时间可能会有所不同取决于他们在哪里).因此,在将UTC DateTime转换为另一个时区时,我们只是找到该区域中的当地时间,该时间对应于相同的millis.
您可以在两个对象上使用getMillis()方法检查:
System.out.println(mStartDate.getMillis()); // 1497312000000
System.out.println(mStartDate.withZone(DateTimeZone.getDefault()).getMillis()); // 1497312000000
请注意,即使我将对象转换为另一个时区,millis仍保持不变(1497312000000).那是因为两者都代表同一时刻,我只是将它们移动到另一个时区,其中各自的当地时间不同.
Java新的日期/时间API
Joda-Time它被停用并被新的API取代,所以我不建议用它开始一个新项目.如果是这种情况,您可以考虑使用新的日期/时间API,但如果您使用Joda的代码库很大或者现在不想迁移它,您可以考虑其余的答案.
无论如何,即使在joda’s website它说:“请注意,Joda-Time被认为是一个很大程度上已完成的项目.没有计划进行重大改进.如果使用Java SE 8,请迁移到java.time(JSR-310).” *.
如果您使用Java< = 7,则可以使用ThreeTen Backport,这是Java 8的新日期/时间类的一个很好的后端.对于Android,有一种方法可以使用它,使用ThreeTenABP(更多关于如何使用它here).
以下代码适用于两者.
唯一的区别是包名称(在Java 8中是java.time,在ThreeTen Backport(或Android的ThreeTenABP)中是org.threeten.bp),但类和方法名称是相同的.
要以UTC开头获取当前日期,您可以执行以下操作:
// UTC's today at start of the day
ZonedDateTime utc = LocalDate.now(ZoneOffset.UTC).atStartOfDay(ZoneOffset.UTC);
System.out.println(utc); // 2017-06-13T00:00Z
首先,我使用LocalDate.now(ZoneOffset.UTC)来查找UTC中的当前本地日期.如果我只使用LocalDate.now(),它将在我的默认时区得到当前日期,这不是我们想要的(它可能与UTC不同,具体取决于你在哪里 – 何时 – 你是什么以及默认时区是什么是).
然后我使用atStartOfDay(ZoneOffset.UTC)来获取UTC当天的开始.我知道使用UTC两次听起来多余,但是API允许我们在这种方法中使用任何时区,而IMO它明确了我们想要的时区(如果日期是在夏令时变化的时区,那么一天的开始可能不是午夜 – 时区参数是为了保证设置正确的值).
输出是:
2017-06-13T00:00Z
要转换为我的默认时区,我可以使用ZoneId.systemDefault(),在我的例子中返回America / Sao_Paulo.要转换它并只获取本地时间部分,只需执行以下操作:
System.out.println(utc.withZoneSameInstant(ZoneId.systemDefault()).toLocalTime()); // 21:00
输出是:
21:00
如果要更改它,还可以使用格式化程序:
// formatter for localtime (hour/minute/second)
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("HH:mm:ss");
System.out.println(fmt.format(utc.withZoneSameInstant(ZoneId.systemDefault()))); // 21:00:00
输出是:
21:00:00
标签:android,java,datetime,jodatime,datetime-conversion
来源: https://codeday.me/bug/20190727/1551856.html
java joda 获取utc时间_java – 使用JodaTime以毫秒为单位的UTC到本地时间相关推荐
- java joda 获取utc时间_Java获取时间与系统时间相差8小时终极解决方案
0.引言 Druid中时区的问题一直困扰着我们,所以我专门去研究了一下世界时区和Java中的时区,对使用Druid很用帮助. 1.UTC时间&GMT时间 UTC时间是时间标准时间(Univer ...
- java如何获取当天日期_Java 中获取当前时间
一. 获取当前系统时间和日期并格式化输出: import java.util.Date; import java.text.SimpleDateFormat; public class NowStri ...
- java编程获取屏幕分辨率_Java编程获取当前屏幕分辨率的方法示例
本文实例讲述了Java编程获取当前屏幕分辨率的方法.分享给大家供大家参考,具体如下: /** * This class implements the functionality of fetching ...
- java joda 获取utc时间_java – JodaTime – 如何获取UTC的当前时间
我想得到当前UTC的时间.到目前为止,我所做的只是为了测试目的: DateTime dt = new DateTime(); DateTimeZone tz = DateTimeZone.getDef ...
- java反射 获取参数名_java
传List.class即可,泛型参数在编译后会被擦除掉,无论List里面是String还是什么别的东西都不会影响获取到那个method,在invoke的时候传的参数对不上的话才会产生异常 //Test ...
- java 动态获取类实例化_Java:使用反射动态实例化类
使用反射动态实例化类,可以在运行时根据参数实例化不同的类,比如使用简单的工厂模式. Factory类: public class Factory { public static Component g ...
- java servlet 获取路径问题_Java,JSP,Servlet获取当前工程路径(绝对路径)问题解析...
在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是webroot 在class文件中,根目录是webroot/web-inf/classes 当然你也可以用system.getpro ...
- java 反射获取实体类_Java 通过反射给实体类赋值操作
表单提交这个方法是挺方便的,但在java来说就显得有些麻烦了, 怎么个麻烦呢,就是当你字段多的时候,你就得一个一个的获取其对应的值,这样代码量就多了起来,其代码量不说,维护也是一个问题. 所以就有了这 ...
- java servlet获取url参数_Java Servlet如何获取请求的参数值?
## Servlet如何获取请求的参数 ## > 使用Request常用API来获取参数 > 这里演示的表单的提交 > 用到的是`getParameter()`和`getParame ...
最新文章
- linux环境没有bzip2,Linux系统中安装使用Bzip2来压缩文件的方法讲解
- 如何在linux下创建一个可运行shell脚本?
- VS 2012 单元测试简单配置
- 将vue项目打包部署到云服务器(傻瓜式宝塔面板)
- Docker CPU 资源限制——CPU分片功能测试
- 写shell工具类,一个常用实例
- jdk安装目录 usr java_Mac查看已安装的jdk版本和jdk安装目录
- 希尔伯特变换(Hilbert Transform)简介及其物理意义
- 基于.Net C# 通信开发-网络调试助手
- 第6章 为用户编程:终端控制和信号
- webpack 图片压缩
- oracle的aud文件是什么,Oracle 11g 在audit_file_dest目录下产生大量的aud文件
- 如何查找SCI期刊的缩写
- Bootstrap按钮样式
- matlab 截屏为什么没有呢,录屏没有呀!什么都没有,只有截屏,原来明明有的,现在不知道为什么就突然没有了(手机华为青春版)...
- 百度网盟广告关键词定向展现方式原理
- 扰码原理以及matlab实现
- 短视频平台推广怎么做
- 广州大学计算机网络实验2,计算机网络实验一_
- display的常用属性
热门文章
- [EffectiveC++]item21:Don't try to return a reference when you must return an object
- zookeeper3.4.6安装
- android学习笔记53——自动朗读TTS
- UVa 10082 - WERTYU 解题报告 - C语言
- C. Present(二分 + 扫描线)
- php返回json的结果
- Follow My Logic 1048 PKU
- mysql5.7 部署文档-rpm
- Lightweight Render Pipeline
- BASIC-1_蓝桥杯_闰年判断