英文:
I have a big integer value which I need to convert into date time in (yyyy-mm-dd hr:ss:mss)
问题
Expected output- 2023-06-22 23:38:03:466
英文:
I have a big integer value which I need to convert into date time in (yyyy-mm-dd hr:ss:mss)
BigInteger sum= new BigInteger("2023062223380346");
// long unixSeconds = 1429582984839;
Date date1 = new Date(sum);
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy h:mm:ss a");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+1"));
String formattedDate = sdf.format(date1);
System.out.println(formattedDate);
Expected output- 2023-06-22 23:38:03:466
答案1
得分: 1
# 简要说明
```java
LocalDateTime
.parse(
"20230622233803466" ,
DateTimeFormatter.ofPattern ( "uuuuMMddHHmmssSSS" )
)
.toString()
.replace( "T" , " " )
2023-06-22 23:38:03.466
详细信息
您正在使用可怕的传统日期时间类,这些类在多年前被现代的java.time类(JSR 310中定义)所取代。始终使用java.time类来处理日期时间。
java.time类
我假设您的示例输入字符串 "2023062223380346"
是一个打字错误,因为与您期望的输出 2023-06-22 23:38:03:466
相比,它缺少一个数字。
定义一个格式化模式以匹配您的输入。
String input = "20230622233803466";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmssSSS" );
将其解析为LocalDateTime
,一个带有日期和时间的日期,但缺少时区或UTC偏移量的上下文。
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
生成标准ISO 8601格式的文本。
String iso8601 = ldt.toString() ;
将中间的 T
替换为空格,与您的期望输出相匹配。
String output = iso8601.replace( "T" , " " ) ;
iso8601 = 2023-06-22T23:38:03.466
output = 2023-06-22 23:38:03.466
显然,您希望将其解释为表示特定时区的时刻。使用时区名称而不是假设偏移量。偏移量可以在不同时间段内变化 - 这就是时区的定义,即由特定地区的人民根据他们的政治决策而决定的,过去、现在和将来的偏移量变化的命名历史。
ZoneId z = ZoneId.of( "Europe/London" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
zdt.toString() = 2023-06-22T23:38:03.466+01:00[Europe/London]
提示:向数据的发布者传达在以文本形式传递日期时间值时使用标准ISO 8601格式的好处。
<details>
<summary>英文:</summary>
# tl;dr
LocalDateTime
.parse(
"20230622233803466" ,
DateTimeFormatter.ofPattern ( "uuuuMMddHHmmssSSS" )
)
.toString()
.replace( "T" , " " )
>2023-06-22 23:38:03.466
# Details
You are using terrible legacy date-time classes were years ago supplanted by the modern java.time classes defined in JSR 310. Always use *java.time* classes for your date-time handling.
# *java.time* classes
I assume your example input string `"2023062223380346"` is a typo, as it is missing a digit on the end when compared to your desired output `2023-06-22 23:38:03:466`.
Define a formatting pattern to match your input.
String input = "20230622233803466";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmssSSS" );
Parse as a `LocalDateTime`, a date with time of day but lacking the context of a time zone or offset-from-UTC.
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
Generate text in standard ISO 8601 format.
String iso8601 = ldt.toString() ;
Replace the `T` in the middle with a SPACE, per your desired output.
String output = iso8601.replace( "T" , " " ) ;
See this code [run at Ideone.com][1].
>iso8601 = 2023-06-22T23:38:03.466
>
>output = 2023-06-22 23:38:03.466
Apparently you want to interpret this as representing a moment in a specific time zone. Use time zone names rather than assuming an offset. Offsets can vary for different periods of time — that is the definition of a time zone, a named history of the past, present, and future changes to the offset used by the people of a particular region as decided by their politicians.
ZoneId z = ZoneId.of( "Europe/London" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
>zdt.toString() = 2023-06-22T23:38:03.466+01:00[Europe/London]
----------
Tip: Educate the publisher of your data about the benefits of using standard [ISO 8601][2] formats when communicating date-time values textually.
[1]: https://ideone.com/UBK9uD
[2]: https://en.wikipedia.org/wiki/ISO_8601
</details>
# 答案2
**得分**: 0
如果您有一个已知格式的字符串,您可以提取所需部分并构建任何接受这些部分的日期/时间对象,例如`ZonedDateTime`。
如果您需要一个`Date`对象,您可以基于`ZonedDateTime`来构建它。
```java
public static void main(String... args) {
String str = "2023062223380346";
ZonedDateTime zonedDateTime = convert(str, ZoneId.of("Europe/London"));
System.out.println(zonedDateTime); // 2023-06-22T23:38:03.000000046+01:00[Europe/London]
}
public static ZonedDateTime convert(String str, ZoneId zoneId) {
return ZonedDateTime.of(Integer.parseInt(str.substring(0, 4)),
Integer.parseInt(str.substring(4, 6)),
Integer.parseInt(str.substring(6, 8)),
Integer.parseInt(str.substring(8, 10)),
Integer.parseInt(str.substring(10, 12)),
Integer.parseInt(str.substring(12, 14)),
Integer.parseInt(str.substring(14)),
zoneId);
}
请注意,上面的代码是用Java编写的,用于从给定字符串构建ZonedDateTime
对象。
英文:
In case you get a strign with known format, you can extract required part and build any date/time
object, that accept all these parts separately. E.g. ZonedDateTime
.
In case you nee a Date
object, you can build it based on ZonedDateTime
.
public static void main(String... args) {
String str = "2023062223380346";
ZonedDateTime zonedDateTime = convert(str, ZoneId.of("Europe/London"));
System.out.println(zonedDateTime); // 2023-06-22T23:38:03.000000046+01:00[Europe/London]
}
public static ZonedDateTime convert(String str, ZoneId zoneId) {
return ZonedDateTime.of(Integer.parseInt(str.substring(0, 4)),
Integer.parseInt(str.substring(4, 6)),
Integer.parseInt(str.substring(6, 8)),
Integer.parseInt(str.substring(8, 10)),
Integer.parseInt(str.substring(10, 12)),
Integer.parseInt(str.substring(12, 14)),
Integer.parseInt(str.substring(14)),
zoneId);
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论