【Java 基础】Java日期格式问题
阅读原文时间:2023年07月11日阅读:1

1. Use SimpleDateFormat to format Date.

Watch out, SDF is NOT THREAD-SAFE, it might not be important but keep that in mind.

/**
* 时间格式(yyyy-MM-dd)
*/
public static final String DATE_PATTERN = "yyyy-MM-dd";
public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE_PATTERN);
/**
* 时间格式(yyyy-MM-dd HH:mm:ss)
*/
public static final String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern(DATE_TIME_PATTERN);


public static String getStringByDate(Date date) {
        SimpleDateFormat  format = new SimpleDateFormat(DATE_PATTERN); //DateFormat
        Date date = null;
        try {
            // Fri Feb 24 00:00:00 CST 2012
            date = format.parse(str);

        } catch (ParseException e) {
           e.printStackTrace();
        }
}


    private static String dateToString(Date dt, String dateFormate)
    {
        DateFormat dFormat = new SimpleDateFormat(dateFormate);//DATE_PATTERN
        return dFormat.format(dt);
    }

2. Use DateTimeFormatter to format Date

It is true however that DateTimeFormatters are thread-safe and hence will have one instantiation more per call.

/**
* 默认 zoneId
*/
private static final ZoneId DEFAULT_ZONE_ID = TimeZone.getTimeZone("GMT+8").toZoneId();


 Date date = new Date();//System time
 LocalDate ldate = LocalDate.from(date.toInstant().atZone(DEFAULT_ZONE_ID));
 String s = DateTimeFormatter.ISO_DATE.format(ldate); // uuuu-MM-dd


public static Date getDateByStringHms(String st) {
   LocalDateTime localDateTime=LocalDateTime.parse(st, Constant.DATE_TIME_FORMATTER);
   Instant instant = localDateTime.atZone(DEFAULT_ZONE_ID).toInstant();
   return Date.from(instant);
}


public static String getStringByDate(Date date) {
   Instant instant = date.toInstant();
   LocalDate localDate = instant.atZone(DEFAULT_ZONE_ID).toLocalDate();
   return localDate.format(Constant.DATE_FORMATTER);
}

格式问题

使用上诉方法,譬如:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, 1);
Date date = cal.getTime();
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
String date1 = format1.format(date);
Date inActiveDate = null;
try {
    inActiveDate = format1.parse(date1);
} catch (ParseException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

如果直接使用inActiveDate.toString将产生inActiveDate = Wed Sep 26 00:00:00 IST 2019这种格式的数据。如果需要与数据库交互,需要的是2019-09-26, 这个时候就得使用 JDBC中扩展的3个类:

java.sql.Date,
java.sql.Time,
java.sql.Timestamp


public static Date getDateByStringHms(String lstr_sysdate)
{
   Date utilDate = localDateTimeToDate(LocalDateTime.parse(lstr_sysdate, Constant.DATE_TIME_FORMATTER));
   return new java.sql.Timestamp(utilDate.getTime());
}

然后再取.subString(0,19)

未知类型(可以是java.util.Datejava.sql.Date)转换为String

如果已知输入变量是java.sql.Date,那么可以简单地转换它并调用toLocalDate()方法:

LocalDate date = ((java.sql.Date) input).toLocalDate();

不幸的是,你不能在java.sql.Date上调用toInstant(),因为according to javadoc,它总是抛出UnsupportedOperationException. 此时可以有两种解决方案

使用getTime()

如果不知道类型(可以是java.util.Datejava.sql.Date),可以使用·getTime()·方法返回的值来构建Instant,然后将其转换为时区(下面我使用的是JVM的默认值),最后从中获取本地日期:

LocalDate date = Instant
    // get the millis value to build the Instant
    .ofEpochMilli(input.getTime())
    // convert to JVM default timezone
    .atZone(ZoneId.systemDefault())
    // convert to LocalDate
    .toLocalDate();

toLocalDate()方法获取日期部分(日/月/年),忽略其余部分,因此无需截断它:如果时间是午夜,上午10点或当天的任何其他时间都无关紧要,toLocalDate()将忽略它并获得日期部分.

但是,如果真的想将时间设置为午夜,则可以使用with method并将LocalTime传递给它:

LocalDate date = Instant
    // get the millis value to build the Instant
    .ofEpochMilli(input.getTime())
    // convert to JVM default timezone
    .atZone(ZoneId.systemDefault())
    // set time to midnight
    .with(LocalTime.MIDNIGHT)
    // convert to LocalDate
    .toLocalDate();

toLocalDate()方法将忽略时间部分,因此在这种情况下不需要设置时间(LocalDate将是相同的).

检查日期的类型并相应地选择相应的操作

if (input instanceof java.sql.Date) {
    date = ((java.sql.Date) input).toLocalDate();
} else {
    date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}