Tag: timezone

用Joda和时区解析约会

我有两个时间戳,以两种不同的格式描述相同的时刻。 2010-10-03 18:58:07和2010-10-03T16:58:07.000+02:00 我用Joda用两个不同的日期格式化器解析时间戳。 最后,我希望有两个DateTime对象,它们在同一时刻是相等的。 DateFormatter提供了几种控制时区和语言环境的方法,但我无法使其工作。 这是我想要的代码: final String date1 = “2010-10-03 18:58:07”; // Europe/Berlin local time final DateTimeFormatter formatter1 = DateTimeFormat.forPattern(“yyyy-MM-dd HH:mm:ss”); final DateTime dateTime1 = formatter1.parseDateTime(date1); final String date2 = “2010-10-03T16:58:07.000+02:00”; // Europe/Berlin local time with time zone final DateTimeFormatter formatter2 = DateTimeFormat.forPattern(“yyyy-MM-dd’T’HH:mm:ss.SSSZ”); final DateTime dateTime2 = formatter2.parseDateTime(date2); Assert.assertTrue(dateTime1.isEqual(dateTime2)); 如果有人可以帮助我,请提前感谢!

处理Web应用程序中的时区

在我们的网络应用程序中,我们需要显示和输入不同时区的不同国家/地区的日期时间信息。 现在,我们正在为每个国家/地区维护单独的Web服务器和单独的数据库(oracle 11g)。 我们计划将所有门户网站合并为一个数据库(oracle 11g)。 此门户应捕获/显示用户本地时区的日期和时间。 到目前为止,我已经搜索了这个,我得到了以下建议。 1)将Web服务器和数据库服务器的时区设置为UTC,同时将获取数据(数据和时间)转换为用户本地时区。 如果您建议采用这种方法,请澄清以下具体问题。 大多数时候我们只捕捉日期,是否需要始终捕捉日期和时间以及时区? 同时存储我们需要在javascript / java / oracle中将用户本地时区转换为UTC的日期和时间? 在获取我们需要将UTC转换为用户的日期和时间时 本地时区查询本身/ java / java脚本? 很多地方我们有报告显示基于日期列,如 今天/当前月/日期范围。我们可以处理这个(输入 – 用户本地时区 – UTC中的数据库)? 我们必须将哪种数据类型用于日期字段(日期/时间戳/时间戳与时区/时间戳与本地时区)? 2)以用户本地时区和UTC捕获日期和时间。 存储为单独的列,用户本地时区将用于显示目的,UTC将用于业务逻辑。 如果您建议采用这种方法,请澄清以下具体问题。 存储用户本地时区和UTC的常见做法是什么? 我需要检查条件,同时根据日期列显示报告,例如今天/当前月/日期范围? 我们必须使用哪种数据类型作为日期列 (日期/时间戳/时间戳,带时区/时间戳和本地时间 区)? 提前致谢

Jodatime将时间划分日期时间转换为millis

有人可以向我解释为什么当我试图获得一个与我自己的区域不同的DateTime的毫秒时,它会让我回到我本地机器时区的毫秒数? 我希望得到UTC的毫秒数,但我的应用程序的本地设置被设置为EST(即使我实际上在爱尔兰;)) 这是代码: DateTimeFormatter format = DateTimeFormat.mediumDateTime(); DateTime local = new DateTime(); DateTime utc = new DateTime(System.currentTimeMillis(), DateTimeZone.UTC); System.out.println(“utc zone = ” +utc.getZone()); System.out.println(“UTC time: ” + utc); long current = utc.getMillis(); System.out.println(“current: ” + format.print(current)); System.out.println(“local: ” + format.print(local.getMillis())); 这是它打印的内容: utc zone = UTC UTC time: 2013-08-16T13:36:32.444Z current: Aug 16, 2013 9:36:32 AM local: […]

如何从Locale获取当前时间和时区?

我有这个奇怪的问题,当我创建一个带语言环境的日历时,TimeZone只是恢复到本地日历 public void start(Locale locale){ String s = locale.getDisplayName(); System.err.println(s); Calendar c = new GregorianCalendar(locale); System.err.println(c.getTimeZone()); } 这是输出: español (Argentina) sun.util.calendar.ZoneInfo[id=”Europe/Bucharest”, //etc more useless date here…. 如何从特定区域获得适当的时间?

Hibernate强制时间戳持续/加载为UTC

我正在使用java,mysql,hibernate(3.6.x)。 在java方面,我使用的是java.sql.Timestamp对象。 在mysql方面我正在使用datetime列。 我希望hibernate使用UTC时区保存/加载这些Timestamp对象,而不管system / java / mysql时区。 我发现“ 如何使用JPA和Hibernate以UTC时区存储日期/时间和时间戳 ”,这些信息很丰富,但缺少一些我很难找到的最终实现信息。 我想实现一个UtcTimestampTypeDescriptor,如该线程所示,并配置hibernate使用它而不是正常的TimestampTypeDescriptor。 如何配置hibernate以使用UtcTimestamp类型而不是默认的Timestamp类型?

如何编写unit testing以确保我的基于日期/时间的代码适用于所有时区和/ DST?

我正在使用JodaTime 2.1,我正在寻找一种unit testing代码的模式,该代码执行日期/时间操作以确保它在所有时区都表现良好且独立于DST 。 特别: 我如何模拟系统时钟(所以我不必模拟我调用new DateTime()以获取当前时间的所有位置) 如何在默认时区执行相同操作?

Grails将日期时间保存为UTC时间,但将其作为本地服务器时间读取?

我的Grails应用程序中有以下行将默认时区设置为UTC: TimeZone.setDefault(TimeZone.getTimeZone(“UTC”)) 我有一个带有dateCreated字段的Audit实体: class Audit { Date dateCreated String message } 然后我创建并保存它的一个实例: def audit = new Audit(message: “Testing audit message”) 这会将其作为UTC时间正确保存到我的数据库中。 但是,当我尝试阅读它时: audit = Audit.get(1) 时间戳将作为本地时间回读。 因此,如果我的时区是+1 UTC并且当前本地时间是BST的 12:34:56 ,那么将保存到数据库的是11:34:56 ,但是当我读回它时,它变为11:34:56 BST 。 有没有人知道如何解决这个问题,以便Grails将时间戳读回UTC并相应地转换它?

Oracle / JDBC:以ISO 8601格式检索TIMESTAMP WITH TIME ZONE值

关于部分主题已经说了很多(并且写在SO上),但是没有全面,完整的方式,所以我们可以有一个“终极,覆盖所有”的解决方案供所有人使用。 我有一个Oracle DB,我存储全局事件的日期+时间+时区,因此必须保留原始TZ,并根据请求传送到客户端。 理想情况下,它可以通过使用标准的ISO 8601“T”格式很好地工作,该格式可以使用“TIMESTAMP WITH TIME ZONE”列类型(“TSTZ”)很好地存储在Oracle中。 类似于‘2013-01-02T03:04:05.060708 + 09:00’ 我需要做的就是从DB中检索上述值并将其发送到客户端而无需任何操作。 问题是Java缺乏对ISO 8601(或任何其他日期+时间+ nano + tz数据类型)的支持,情况更糟,因为Oracle JDBC驱动程序(ojdbc6.jar)对TSTZ的支持更少(相对于Oracle DB本身得到了很好的支持)。 具体来说,这是我不应该或不能做的: 从TSTZ到Java Date,Time,Timestamp(例如通过JDBC getTimestamp()调用)的任何映射都不起作用,因为我丢失了TZ。 Oracle JDBC驱动程序没有提供将TSTZ映射到Java Calendar对象的任何方法(这可能是一个解决方案,但它不存在) JDBC getString()可以工作,但Oracle JDBC驱动程序以格式返回字符串 ‘2013-01-02 03:04:05.060708 +9:00’,不符合ISO 8601(没有“T”,TZ没有尾随0等)。 此外,此格式在Oracle JDBC驱动程序实现中是硬编码的(!),它还忽略了JVM区域设置和Oracle会话格式设置(即它忽略了NLS_TIMESTAMP_TZ_FORMAT会话变量)。 JDBC getObject()或getTIMESTAMPTZ()都返回Oracle的TIMESTAMPTZ对象,这实际上是无用的,因为它没有任何转换为​​Calendar(只有Date,Time和Timestamp),所以我们再次失去了TZ信息。 那么,这是我留下的选项: 使用JDBC getString(),并对其进行字符串操作以修复并使ISO 8601兼容。 这很容易做到,但如果Oracle更改了内部硬编码的getString()格式,则存在死亡的危险。 另外,通过查看getString()源代码,似乎使用getString()也会导致一些性能损失。 使用Oracle DB“toString”转换:“SELECT TO_CHAR(tstz …)EVENT_TIME …”。 这很好,但有两个主要的不利因素: 每个SELECT现在必须包含TO_CHAR调用,这是一个令人头疼的记忆和写入 每个SELECT现在必须添加EVENT_TIME列“别名”(例如需要自动将结果序列化为Json) 。 使用Oracle的TIMESTAMPTZ java类并从其内部(记录的)字节数组结构手动提取相关值(即实现我自己的toString()方法,Oracle忘记在那里实现)。 如果Oracle改变内部结构(不太可能)并且需要相对复杂的function来实现和维护,这是有风险的。 […]

Java日期时间格式转换

在这里约会我的问题: String datetime = “2012-03-24 23:20:51”; 我知道该字符串是UTC时区。 我需要将此字符串转换为格式“yyy-mm-dd’T’HH:mm:ssZ”。 为此,我使用以下代码: SimpleDateFormat inFormatter = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); inFormatter.setTimeZone(TimeZone.getTimeZone(“UTC”)); Date inDate = inFormatter.parse(datetime); SimpleDateFormat outFormatter = new SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ssZ”); outFormatter.setTimeZone(TimeZone.getTimeZone(“UTC”)); String output = outFormatter.format(inDate); 问题是这个代码在时区UTC + 1的服务器上运行,它给我的结果如下: output = “2012-03-24T21:20:51+0000” 它从初始时间开始移除2小时并放置UTC时间戳(0000)。 你能帮我解决这个问题吗? 谢谢。

如何从java中获取时区偏移量的时区?

我知道如何相反。 给出了一个时区我可以通过以下代码片段获得时区偏移量: TimeZone tz = TimeZone.getDefault(); System.out.println(tz.getOffset(System.currentTimeMillis())); 我想知道如何从时区偏移中获取时区名称。 鉴于, timezone offset = 21600000 (以毫秒为单位; +6.00偏移量) 我想获得以下任何可能的时区名称的结果: (GMT+6:00) Antarctica/Vostok (GMT+6:00) Asia/Almaty (GMT+6:00) Asia/Bishkek (GMT+6:00) Asia/Dacca (GMT+6:00) Asia/Dhaka (GMT+6:00) Asia/Qyzylorda (GMT+6:00) Asia/Thimbu (GMT+6:00) Asia/Thimphu (GMT+6:00) Asia/Yekaterinburg (GMT+6:00) BST (GMT+6:00) Etc/GMT-6 (GMT+6:00) Indian/Chagos