当前位置: 首页 > 知识库问答 >
问题:

面对Android中的数据格式问题,CDT转换为IST

黄查猛
2023-03-14

如何解决这个问题,有谁能帮助我吗?

共有1个答案

彭骏
2023-03-14

您的印度时间被正确地调整为比芝加哥时间提前10.5小时。功能,而不是bug。(我假设您的:56秒是您的问题中的错别字。)

如果不希望进行此类调整,而是希望将相同的日期和相同的时间分配给不同的时区,则执行以下操作:

ZonedDateTime.parse(
    "Mon May 9 09:34:13 CDT 2016" ,  // If at all possible, avoid using such an awful format for exchanging date-time strings. Always use standard ISO 8601 formats instead.
    DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" )
)                                    // Returns a `ZonedDateTime` object.
.withZoneSameLocal( 
    ZoneId.of( "Asia/Kolkata" ) 
)                                    // Returns a fresh `ZonedDateTime` object, with values based on the original but for the change in assigned zone.
.toString()                          // Generates a String is standard ISO 8601 format, extending the standard by appending the name of the time zone in square brackets.

2016-05-09T09:34:13+05:30“亚洲/加尔各答”

我们得到了相同的日期和时间,但不同的OFFSET-FORM-UTC意味着这是一个不同的时刻,时间线上的一个不同的点。

[注意:我假设您的Mon May 09 20:04:56 IST 2016中的:56是一个错别字,应该是:13。]

字符串Mon May 9 09:34:13 CDT 2016Mon May 09 20:04:13 IST 2016表示同一时刻。这是一个特性,而不是一个bug。如果CDT指的是一个时区,如America/Chicago,则该日期的值表示UTC后5小时的时刻,-05:00。如果所说的IST是指一个时区,如亚洲/加尔各答,则该日期的印度比UTC提前五个半小时,+05:30。把这些偏移加在一起,我们得到十个半小时的差值。这符合:09:34:13加上10.5小时等于20:04:13

也就是说,如果芝加哥的某个人正在和加尔各答的某个人通电话,如果他们都抬头看自家墙上时钟上的时间,一个会看到09:34:13,而另一个会看到20:04:13。

也许您想故意不针对时区进行调整,而是在不同的时区中重新创建具有相同时间的相同日期。这将不是同一时刻,这将是时间线上的一个不同点。这类代码见下文。

您使用的是很久以前被现代java.time类取代的麻烦的旧类。

Instant instant = Instant.now() ;  // Capture current moment in UTC.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ; 
ZonedDateTime zdt = instant.atZone( z ) ;  // Same moment, same point on the timeline, but different wall-clock time.

此外,不要使用3-4个字母的伪时区,如CDTIST。这些不是真正的时区,不是标准化的,而且许多不是唯一的(!)。使用全时区名称是IANA指定的大陆/地区格式。

但是直接回答您的问题,解析字符串Mon May 9 09:34:13 CDT 2016定义要匹配的格式模式。

String input = "Mon May 9 09:34:13 CDT 2016";

DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM d HH:mm:ss z uuuu" );
ZonedDateTime zdt = ZonedDateTime.parse( input , f );

ZDT.ToString():2016-05-09T09:34:13-05:00[美国/芝加哥]

ZoneId zKolkata = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant( zKolkata );

ZdtKolkata.ToString():2016-05-09T20:04:13+05:30“亚洲/加尔各答”

与您在遗留类中看到的行为相同。把10.5小时延长到9:34:13,我们得到20:04:13。同样的时刻,同样的时间线上的点,却不同的挂钟时间。

但是,如果您想要相同的日期和相同的时间,但却切换了时区,那该怎么办呢?这将导致不同的时刻,时间线上的不同点(假设两个区域不共享相同的偏移量)。ZonedDateTime通过ZonedDateTime::WithZoneSameLocal(ZoneId zone)方法支持此操作。

ZonedDateTime zdtSameLocalKolkata = zdt.withZoneSameLocal( zKolkata );

您可以通过将两者调整为UTC来验证它们是不同时刻的事实。进行这种调整的简单方法是提取instant对象。根据定义,即时始终是UTC格式。

Instant instantOfZdtChicago = zdt.toInstant() ;
Instant instantOfZdtSameLocalKolkata = zdtSameLocalKolkata.toInstant():

InstantoFZDtChicago.ToString():2016-05-09T14:34:13Z

InstantOfzdtSameloCalkolkata.ToString():2016-05-09T04:04:13Z

您可以直接与数据库交换java.time对象。使用与JDBC4.2或更高版本兼容的JDBC驱动程序。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8、Java SE 9、Java SE 10及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9添加了一些小功能和修补程序。
      null
      null

 类似资料:
  • 我需要将长数据格式(long)转换为宽格式(wide),条件如下(如果可能): 1) 所有数据文件都将是具有相同结构(id、名称、值)的长格式(long),但每个数据文件将具有不同的变量、值和变量数: 2) 每个数据文件将是不同的变量混合物(因子、整数、数字)。有些因素可能每个案例都有多个级别(从长远来看是水果和肉),我想为这些因素中的每个级别创建一个单独的虚拟变量(逻辑)。因子和数值变量的数量将

  • Excel转KML        在“数据处理”菜单栏中,点击“Excel转KML”,弹出对话框,点击打开XLS,选择要转换的Excel文件(可以添加LSV文件夹下示例数据中的EXCEL2KML示例数据.xls进行测试),读取完成后,可以在上方的表格里看到Excel里的信息。在Excel表格内容的下面分了两块,左侧一块为经纬度和气泡内容的选择,右侧一块是对要生成的kml图层的风格的设置。    

  • 问题内容: 我有一些格式的数据: 我需要将其转换为格式 如何在SQL中执行此操作? 问题答案: 如果您的得分列是固定的,并且不需要汇总,则可以使用多个和语句来生成所需的数据形状。例如 SQL小提琴:http://sqlfiddle.com/#!6 / f54b2 / 4/0

  • 上边格式如何转换为以下格式

  • 我试图用GSON将一个对象转换成JSON格式。然后,我将把JSON发送给用php编写的webservice。不幸的是,由于某种原因,gson.toJson(object)方法不起作用。 我有这个java对象干预(它包含字符串、日期、时间和位图类型的几个字段)。当我尝试这样做时: 我在gson变量中得到这个: gson={seralizeNulls: false工厂:[Factory[type=co

  • 我现在正在解析一个26页的文件。带有图像、表格、斜体和下划线的docx。我能清除 我使用ApachePOI创建了带有XWPF段落列表的XWPF文档格式。当我遍历XWPF段落时,如果一个段落包含不同的样式,我无法获得各行的样式(斜体、下划线、粗体)。 我尝试过使用XWPF。段落getrun()。XWPF。。。跑getfamilyfont()我将得到null。但是当我运行XWPF时,我在段落级别获得数