Java 日期至当地时间kotlin

Java 日期至当地时间kotlin,java,android,date,kotlin,Java,Android,Date,Kotlin,我有一个约会对象 4月26日星期日11:44:00 GMT+2020年03:00 我试图格式化它,但它总是忽略时区+3:00,并显示小时而不更改它 我所尝试的: val sdf = SimpleDateFormat("dd MM yyyy HH:mm:ss", Locale.US) return sdf.format(this) 我不太明白你的问题,但我猜你的意思是你需要与特定区域相关的日期时间。在科特林,我们有一节业余课 导入java.time.ZoneId 导入java.ti

我有一个约会对象

4月26日星期日11:44:00 GMT+2020年03:00

我试图格式化它,但它总是忽略时区+3:00,并显示小时而不更改它

我所尝试的:

   val sdf = SimpleDateFormat("dd MM yyyy HH:mm:ss", Locale.US)
    return sdf.format(this)

我不太明白你的问题,但我猜你的意思是你需要与特定区域相关的日期时间。在科特林,我们有一节业余课

导入java.time.ZoneId 导入java.time.zoneDateTime 导入java.time.format.DateTimeFormatter 导入java.time.format.FormatStyle val londonZone=欧洲地区/伦敦 val londonCurrentDateTime=ZonedDateTime.nowlondonZone PrintlLondonCurrentDateTime//输出:2018-01-25T07:41:02.296Z[欧洲/伦敦] val londonDateAndTime=londonCurrentDateTime.formatDateTimeFormatter.OfCalizedDateTimeFormatStyle.FULL,FormatStyle.MEDIUM PrintlLondonDateAndTime//输出:2018年1月25日星期四上午7:40:34
您可能还需要查看LocalDateTime类。

我不完全理解您的问题,但我猜您的意思是需要与特定区域相关的DateTime。在科特林,我们有一节业余课

导入java.time.ZoneId 导入java.time.zoneDateTime 导入java.time.format.DateTimeFormatter 导入java.time.format.FormatStyle val londonZone=欧洲地区/伦敦 val londonCurrentDateTime=ZonedDateTime.nowlondonZone PrintlLondonCurrentDateTime//输出:2018-01-25T07:41:02.296Z[欧洲/伦敦] val londonDateAndTime=londonCurrentDateTime.formatDateTimeFormatter.OfCalizedDateTimeFormatStyle.FULL,FormatStyle.MEDIUM PrintlLondonDateAndTime//输出:2018年1月25日星期四上午7:40:34
您可能还需要查看LocalDateTime类。

格式字符串取决于您使用的SimpleDateFormat:

如果与API级别24+一起使用,格式字符串需要为: EEE MMM d HH:mm:ss'GMT'XXX yyyy

如果使用,格式字符串需要为: EEE MMM d HH:mm:ss OOOO yyyy

纯Java演示

输出

格式:Sun Apr 26 11:44:00 GMT+03:00 2020 解析回:Sun Apr 26 11:44:00 IDT 2020 百万分之二:15878906400
格式字符串取决于您使用的SimpleDataFormat:

如果与API级别24+一起使用,格式字符串需要为: EEE MMM d HH:mm:ss'GMT'XXX yyyy

如果使用,格式字符串需要为: EEE MMM d HH:mm:ss OOOO yyyy

纯Java演示

输出

格式:Sun Apr 26 11:44:00 GMT+03:00 2020 解析回:Sun Apr 26 11:44:00 IDT 2020 百万分之二:15878906400
如果您只想用给定的模式解析datetime字符串,然后将结果转换为不同的偏移量,您可以这样做:

娱乐中心{ //提供源字符串 val datetime=太阳4月26日11:44:00 GMT+03:00 2020 //提供用于解析的模式 val parsePattern=E MMM dd HH:mm:ss O yyyy; //将字符串解析为OffsetDateTime val parsedOffsetDateTime=java.time.OffsetDateTime.parse 日期时间, java.time.format.DateTimeFormatter.ofPatternparsePattern //使用默认格式打印结果 printlnparsedOffsetDateTime //然后在不同的偏移量下得到相同的时刻 val adjustedOffsetDateTime=parsedOffsetDateTime.withOffsetSameInstant java.time.ZoneOffset.of+02:00 //并将其打印出来,以查看差异 printlnadjustedOffsetDateTime } 哪一个产生输出

2020-04-26T11:44+03:00 2020-04-26T10:44+02:00
如果您只想用给定的模式解析datetime字符串,然后将结果转换为不同的偏移量,您可以这样做:

娱乐中心{ //提供源字符串 val datetime=太阳4月26日11:44:00 GMT+03:00 2020 //提供用于解析的模式 val parsePattern=E MMM dd HH:mm:ss O yyyy; //将字符串解析为OffsetDateTime val parsedOffsetDateTime=java.time.OffsetDateTime.parse 日期时间, java.time.format.DateTimeFormatter.ofPatternparsePattern //使用默认格式打印结果 printlnparsedOffsetDateTime //然后在不同的偏移量下得到相同的时刻 val adjustedOffsetDateTime=parsedOffsetDateTime.withOffsetSameInstant java.time.ZoneOffset.of+02:00 //并将其打印出来,以查看差异 printlnadjustedOffsetDateTime } 哪一个产生输出

2020-04-26T11:44+03:00 2020-04-26T10:44+02:00
您希望得到什么结果?第一个问题必须是为什么要使用旧的Java date api?尤其是在科特林。接下来要指出的是,日期是UTC纪元后的毫秒-没有时区!!您看到的时区是调用toString的结果,toString将使用系统默认时区。基本上,这个问题没有多大意义…@sweeper我想格式化
时间,但不知何故,如果我得到+2GMT或+3GMT,我似乎不会在几小时内影响结果。你真的想以不同的格式设置该日期时间,还是想将其转换为另一个区域或偏移量?那么如果你支持低于26的API级别,并且使用OffsetDateTime或更高的API级别,那么你真的应该使用java.time或backport@kaustubhpatange建议的ZoneDateTime。您想要什么结果?第一个问题必须是为什么要使用旧的Java日期api?尤其是在科特林。接下来要指出的是,日期是UTC纪元后的毫秒-没有时区!!您看到的时区是调用toString的结果,toString将使用系统默认时区。大体上这个问题没有太大的意义…@sweeper我想格式化时间,但不知何故,如果我得到+2GMT或+3GMT,我似乎不会在小时内影响结果。你真的想以不同的方式格式化日期时间,还是想将其转换为另一个区域或偏移量?如果需要,那么你真的应该使用java.time或backport支持低于26的API级别,并使用OffsetDateTime,甚至是@kaustubhpatange建议的ZonedDateTime。
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Jerusalem"));

Date date = new Date(1587890640000L); // date object with "Sun Apr 26 11:44:00 GMT+03:00 2020"

SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss 'GMT'XXX yyyy", Locale.US);
String dateString = sdf.format(date);
System.out.println("Formatted  : " + dateString);

Date parsed = sdf.parse(dateString);
System.out.println("Parsed back: " + parsed);
System.out.println("Millis since Epoch: " + parsed.getTime());