- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
大家早上好。
我想帮助您了解如何使用 1.2.1.1 版本的 Joda Time 完成 org.joda.time.DateTime 到 java.util.Date 的转换。
为什么选择 Joda 1.2.1.1?因为“不幸的是”目前我只能使用这个版本的 Joda。
我的测试>
System.out.println("JODA Version : 2.8.2 - UTC TIME to Date " + new DateTime().withZone(DateTimeZone.UTC).toLocalDateTime().toDate());;
System.out.println("JODA Version : 1.2.1.1 - UTC TIME to Date " + new DateTime().withZone(DateTimeZone.UTC).toDate());;
JODA Version : 2.8.2 - UTC TIME to Date Fri Sep 18 17:34:36 BRT 2015
JODA Version : 1.2.1.1 - UTC TIME to Date Fri Sep 18 14:34:36 BRT 2015
我的问题是,在版本 1.2.1.1 中,日期位于我的本地设置中,而在此版本中没有 toLocalDateTime() 方法。
我会请求您的帮助和经验来发现最佳实践,以便在 JODA 版本:1.2.1.1 中执行此转换
在旧版本的 JODA 中,如何将 UTC 时间转换为时:分:秒?
我做了很多研究,发现有些人说这样做是一个很好的做法?
public static Date converterDateTimeToUTCDate(final DateTime dateTime) throws ParseException {
DateTime dat = dateTime.withZone(DateTimeZone.UTC);
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS").parse(dat.toString("yyyy-MM-dd HH:mm:ss:SSS"));
}
public static void main(String[] args) throws ParseException {
System.out.println("TODO DATE UTC TIME : " + new DateTime().withZone(DateTimeZone.UTC));
System.out.println("TODO DATE Convertion Direct Date: " + new DateTime().withZone(DateTimeZone.UTC).toDate());
Date converterUTCDateTimeToDate = converterDateTimeToUTCDate(new DateTime());
System.out.println("TODO DATE UTC with Parse : " + converterUTCDateTimeToDate);
}
结果:
TODO DATE UTC TIME : 2015-09-18T22:33:57.353Z
TODO DATE Convertion Direct Date: Fri Sep 18 19:33:57 BRT 2015
TODO DATE UTC with Parse : Fri Sep 18 22:33:57 BRT 2015
编辑为什么选择 Joda 1.2.1.1?因为“不幸的是”目前我只能使用这个版本的 Joda。
我在一家公司工作,在项目中更改 API 版本需要很长的过程,而我的项目没有这个等待时间来使用新版本
更新:
我看了一下,java Date没有TimeZone,这个BRT是在类的toString()方法中从我的本地机器捕获的,我可以认为转换是正确的吗?
更新2
我编辑了我的答案示例:
参见:
package joda;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
public class ConverterDateTimeToDate {
public static final String BASE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS z";
public static void main(String[] args) {
// Different display time zones
SimpleDateFormat formatUTC = new SimpleDateFormat( BASE_FORMAT );
formatUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat formatBrazil = new SimpleDateFormat( BASE_FORMAT );
formatBrazil.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
SimpleDateFormat formatCentralEurope = new SimpleDateFormat( BASE_FORMAT );
formatCentralEurope.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam"));
// Get a date in UTC
String dateString = "2015-09-19 10:45:00.000 UTC";
Date javaDate = null;
try {
DateTime dateTime = new DateTime().withZone(DateTimeZone.forID("America/Mexico_City"));
System.out.println("MEX TIME IN JODA : " + dateTime); //new Test
System.out.println("MEX TIME IN JODA CONVERTER : " + dateTime.toDate()); // new Test
System.out.println("Now in MEX Time Zone DateTime : " + dateTime);
javaDate = formatUTC.parse(dateTime.toString(BASE_FORMAT));
} catch (ParseException e) {
e.printStackTrace(); // Shouldn't happen.
}
// Now let's print it in various time zones. It's the same date - 10:45 in UTC!
System.out.println("In UTC: " + formatUTC.format(javaDate));
System.out.println("In Brazil: " + formatBrazil.format(javaDate));
System.out.println("In the Netherlands: " + formatCentralEurope.format(javaDate));
}
}
我的输出:在UTC:2015-09-19 12:10:56.731 CDT,我的转换有问题吗?因为我的系统中的日期时间已经消失了
我的输出:
MEX TIME IN JODA : 2015-09-21T21:17:46.781-05:00
MEX TIME IN JODA CONVERTER : Mon Sep 21 23:17:46 BRT 2015
Now in MEX Time Zone DateTime : 2015-09-21T21:17:46.781-05:00
In UTC: 1732-01-11 02:17:46.781 UTC
In Brazil: 1732-01-10 23:17:46.781 BRT
In the Netherlands: 1732-01-11 03:17:46.781 CET
最佳答案
toDate()
DateTime
类中的方法,即使在旧的 JodaTime 中,也是正确的。这里有一个解释:
java.util.Date
工作原理的说明您似乎对java.util.Date
有误解。它不包含时区。它表示自 1970 年 1 月 00:00 UTC 以来的时间偏移。
当您打印 Date
对象时,您的 JVM 会采用您的默认时区并显示该时区的Date
。因此,当您打印日期时,如果您想在不同的时区查看日期,则应始终使用 DateFormat
对象。例如,如果您想查看 UTC 格式的日期,则必须使用时区设置为 UTC 的日期格式。这是一个例子:
public static final String BASE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS z";
public static void main(String[] args) {
// Different display time zones
SimpleDateFormat formatUTC = new SimpleDateFormat( BASE_FORMAT );
formatUTC.setTimeZone(TimeZone.getTimeZone("UTC"));
SimpleDateFormat formatBrazil = new SimpleDateFormat( BASE_FORMAT );
formatBrazil.setTimeZone(TimeZone.getTimeZone("America/Sao_Paulo"));
SimpleDateFormat formatCentralEurope = new SimpleDateFormat( BASE_FORMAT );
formatCentralEurope.setTimeZone(TimeZone.getTimeZone("Europe/Amsterdam"));
// Get a date in UTC
String dateString = "2015-09-19 10:45:00.000 UTC";
Date javaDate = null;
try {
javaDate = formatUTC.parse(dateString);
} catch (ParseException e) {
e.printStackTrace(); // Shouldn't happen.
}
// Now let's print it in various time zones. It's the same date - 10:45 in UTC!
System.out.println("In UTC: " + formatUTC.format(javaDate));
System.out.println("In Brazil: " + formatBrazil.format(javaDate));
System.out.println("In the Netherlands: " + formatCentralEurope.format(javaDate));
}
该程序的输出是:
In UTC: 2015-09-19 10:45:00.000 UTCIn Brazil: 2015-09-19 07:45:00.000 BRTIn the Netherlands: 2015-09-19 12:45:00.000 CEST
You can see we printed the same date - and it shows up differently based on the time zone of the format.
TimeStamp
to java.util.Date
The same logic is true for Joda's DateTime
object, but it's more complex, because it also includes a time zone, though it is not used for all operations. Internally, it also represents an offset from UTC.
When you use its toDate()
method, it relies on that internal offset from UTC, thus it is giving you the correct Date
object according to the java.util.Date
contract.
Let's demonstrate that by replacing the way we get the date in the above program to:
DateTime jodaDateTime = new DateTime( 2015, 9, 19, 10, 45, 0, 0, DateTimeZone.UTC);
Date javaDate = jodaDateTime.toDate();
现在,运行与之前相同的打印,我们再次得到:
In UTC: 2015-09-19 10:45:00.000 UTCIn Brazil: 2015-09-19 07:45:00.000 BRTIn the Netherlands: 2015-09-19 12:45:00.000 CEST
So you see, if the Joda DateTime
was appropriately set, then using its toDate
gives you the correct Date
object.
toLocalDateTime()
is wrongNow, if we use your first method, the one you thought was correct, which only exists in Joda 2.0 and above, what will we get?
We change the code to:
DateTime jodaDateTime = new DateTime( 2015, 9, 19, 10, 45, 0, 0, DateTimeZone.UTC);
Date javaDate = jodaDateTime.toLocalDateTime().toDate();
Joda DateTime
与之前相同,我们只是添加了仅在 Joda 2 中存在的 toLocalDateTime()
。
假设您系统上的默认时区是 BRT,您将得到结果:
In UTC: 2015-09-19 13:45:00.000 UTCIn Brazil: 2015-09-19 10:45:00.000 BRTIn the Netherlands: 2015-09-19 15:45:00.000 CEST
这显然不是正确的日期! toLocalDateTime()
部分获取您的本地时间偏移量并将其添加到日期中以形成“本地”日期。只要您保持在 Joda 时间构造中,这就很好,但是违反了 java.util.Date
的约定,因为它设置了与 UTC 的不正确偏移。
旧 Joda 中的旧方法是从 org.joda.time.DateTime
获取适当的 java.util.Date
的最佳方法。但您必须非常小心如何打印 java.util.Date
,因为默认情况下它将在您的默认时区中打印。
最后一个建议:如果您想在公司中开始升级过程,请不要浪费 Joda 时间。要求他们开始将系统升级到 Java 8,这是目前 Oracle 维护的唯一 Java 版本。 Java 8 包含一个适当的日期/时间库,Joda 的创建者建议改用它。
关于java - Joda Time - 将 UTC 日期时间转换为日期 - 使用 Joda 版本 1.2.1.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658205/
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 3 年前。 Improve th
当我使用 UTC() 函数获取纪元时间(1970 年 1 月 1 日)的总秒数时。但再次使用“new Date(milliseconds)”构造函数将相同的秒数转换为 Date 并没有给出 UTC d
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我有一个关于 Swift 类型 TimeZone 的问题。我需要一个 UTC0 时区来格式化我的 Date 对象。我正在像这样创建 TimeZone 对象。 let utcTimeZone = Tim
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve t
我遇到了以下代码: datetime.datetime.utcnow().replace(tzinfo=tzutc()) 我看不到 Replace() 调用正在做什么,从阅读文档来看,它似乎将其转换为
我在应用程序中将时区设置为 UTC,如下所示: // set default time zone to UTC TimeZone.setDefault(TimeZone.getTimeZone(Zon
我需要两件事: 将当前时间转换为 UTC(这样我就可以以 UTC 格式存储日期)--> result = java.util.Date. 将加载日期(UTC 格式)转换为任何时区 --> result
我想将日期从本地转换为 UTC,再将 UTC 转换为本地。 例如。 2015 年 4 月 1 日,12:00 PM 然后是 UTC 2015 年 4 月 1 日下午 5:30 对我来说是本地时间,但我
嗨,我有一个长度为几百万的字符向量( rr ),它以 %Y-%m-%d %H:%M:%S 格式表示时间和日期戳。记录在澳大利亚/悉尼。 如何获得代表这一点的 POSIXct 对象(快速)。 我找到了
static String createUTCTime() { Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC")
我正在尝试将语言环境时间转换为 UTC,然后将 UTC 转换为语言环境时间。但我没有得到结果。 public class DateDemo { public static void main(Stri
我正在寻找用纯 Javascript 替换 moment js 功能 - 我需要重新工作的项目将来不会有 moment.js 可用。我已经有一段时间没有使用 javascript Date 了,所以需
我想获取与 UTC 相关的用户时区,然后将其显示为 UTC +/- 。例如,加利福尼亚用户应显示 UTC -8(或 -7,视情况而定),而巴林用户应显示 UTC +3,等等。 下面的代码并没有告诉我它
我正在尝试将毫秒转换为 UTC 日期对象,如下所示 - var tempDate = new Date(1465171200000); // --> tempDate = Mon Jun 06 201
我一直很困惑为什么下面的代码会导致我的日期从 25 日更改为 24 日 SimpleDateFormat sd = new SimpleDateFormat("dd/MM/yyyy"); DateTi
我需要将字符串转换为 UTC 日期,然后将 UTC 日期转换为本地日期。 这是我的代码: var dateStr = "9/8/2015 12:44:00 PM"; console.log(strto
我正在用 PHP 编写一个 Twitter 网络服务。当用户登录时,我收到此节点: -18000 我必须更改脚本的时区,以便它适应用户的实际时区。我为此找到的唯一 php 函数是: date_defa
在 PHP 文档中,list of supported time zones , UTC 被列出两次: UTC 等/UTC 这两者之间有什么概念上的区别,还是它们只是同义词? 最佳答案 首先回答问题:
在 PHP 文档中,list of supported time zones , UTC 被列出两次: UTC 等/UTC 这两者之间有什么概念上的区别,还是它们只是同义词? 最佳答案 首先回答问题:
我是一名优秀的程序员,十分优秀!