如何格式化用于显示的java.sql时间戳?

如何格式化用于显示的java.sql时间戳?,java,datetime,formatting,Java,Datetime,Formatting,如何根据自己的喜好格式化java.sql时间戳?(转换为字符串,用于显示)如果使用MySQL并希望数据库本身执行转换,请使用以下命令: 如果您喜欢使用Java格式化,请使用以下方法: java.sql.Timestamp扩展了java.util.Date。你可以做: String s = new SimpleDateFormat("MM/dd/yyyy").format(myTimestamp); 或者也包括时间: String s = new SimpleDateFormat("MM/d

如何根据自己的喜好格式化java.sql时间戳?(转换为字符串,用于显示)

如果使用MySQL并希望数据库本身执行转换,请使用以下命令:

如果您喜欢使用Java格式化,请使用以下方法:


java.sql.Timestamp
扩展了
java.util.Date
。你可以做:

String s = new SimpleDateFormat("MM/dd/yyyy").format(myTimestamp);
或者也包括时间:

String s = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(myTimestamp);

使用一个。在国际化应用程序中,使用提供的格式。如果您想显式地控制格式,请自己创建一个新的。

对于这个特定的问题,
java.text.simpleDataFormat
的标准建议有效,但是有一个不幸的副作用,那就是
SimpleDateFormat
,并且可能是特别严重的问题的根源,因为它会在多线程场景中损坏您的输出,并且您不会得到任何异常

我强烈建议你看看这样的东西。为什么?它是一个比当前库更丰富、更直观的Java时间/日期库(并且是即将推出的新标准Java日期/时间库的基础,因此您将学习即将成为标准API)。

使用String.format(或):

编辑:
请参阅格式化程序的文档,了解TD和TT的含义:单击

第一个“T”代表:

't', 'T'    date/time   Prefix for date and time conversion characters.
和“T”后面的字符:

'T'     Time formatted for the 24-hour clock as "%tH:%tM:%tS".
'D'     Date formatted as "%tm/%td/%ty". 

字符串TimeFinder-ShsStr=TimeFinder-Ssh.toString()

java.time 我提供的是现代的答案。
Timestamp
类是对已经设计糟糕的
java.util.Date
类的一种攻击,已经过时很久了。不过,我假设您从一个遗留API获得了一个
时间戳
,而您现在无法升级到java.time。当您这样做时,将其转换为现代的
即时
,并从那里进行进一步处理

    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.GERMAN);
    
    Timestamp oldfashionedTimestamp = new Timestamp(1_567_890_123_456L);
    
    ZonedDateTime dateTime = oldfashionedTimestamp.toInstant()
            .atZone(ZoneId.systemDefault());
    String desiredFormat = dateTime.format(formatter);
    
    System.out.println(desiredFormat);
我的时区中的输出:

2019年9月7日23:02:03


通过指定
FormatStyle.short
MEDIUM
long
FULL
来选择所需格式的长短。在我放置的
locale.derman
中选择您自己的语言环境。并选择您想要的时区,例如
ZoneId.of(“欧洲/奥斯陆”)
Timestamp
是一个没有时区的时间点,因此我们需要一个时区,以便能够将其转换为年、月、日、小时、分钟等。如果您的
Timestamp
来自一个类型为
Timestamp
但没有时区的数据库值(通常不推荐,但不幸的是经常看到),
ZoneId.systemDefault()
可能会给您提供正确的结果。在这种情况下,另一个稍微简单的选择是使用
oldfashionedTimestamp.toLocalDateTime()
转换为
LocalDateTime
,然后按照与
ZonedDateTime
相同的方式格式化
LocalDateTime

,这样就行了,但请注意,因为SimpleDataFormat不是线程安全的。请注意,如果SimpleDataFormat对象是一个局部作用域对象(仅在方法内部创建和使用),那么它是线程安全的,因为它所在的堆栈本质上是“线程安全的”(因为它属于单个线程)。若要包含时间,您需要使用SimpleDateFormat(“MM/dd/yyyy hh:MM”)或类似的格式,以便为需要它的人提供完整的时间,字符串S=新的SimpleDateFormat(“MM/dd/yyyy hh:MM:ss”)。格式(myTimestamp);好的警告。但是很容易解决-不要通过将SimpleDataFormat实例存储在会话范围/实例变量/静态上下文中,然后从多个线程访问它们来共享它们。只需在方法中创建一个新的SimpleDataFormat(),并在使用后丢弃它。这是线程安全的。当然,如果您真的想存储/共享SimpleDataFormat实例,那么请同步访问:synchronized(SimpleDataFormatInstance){s=SimpleDataFormatInstance.format(myTimeStamp)}或创建SDF类的自定义扩展,并在format方法中自动执行此操作。我认为这是最好的答案。没有多余的对象仅仅是为了将时间戳转换成字符串而创建的。现在应该很清楚在哪里可以找到文档以及它的含义。为了清楚起见,这里的示例生成的格式看起来像
05/30/17 00:39:18
@本体谢谢,这是问题要求的“我喜欢”的格式[:-)
'T'     Time formatted for the 24-hour clock as "%tH:%tM:%tS".
'D'     Date formatted as "%tm/%td/%ty". 
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.GERMAN);
    
    Timestamp oldfashionedTimestamp = new Timestamp(1_567_890_123_456L);
    
    ZonedDateTime dateTime = oldfashionedTimestamp.toInstant()
            .atZone(ZoneId.systemDefault());
    String desiredFormat = dateTime.format(formatter);
    
    System.out.println(desiredFormat);