sourcecode

Java: 문자열을 타임스탬프로 변환

copyscript 2022. 9. 3. 13:29
반응형

Java: 문자열을 타임스탬프로 변환

String time TimeStamp 、 String 、 TimeStamp string string string string string string string string 。다음 형식의 날짜를 가진 배열이 있습니다.yyyy-MM-dd 이 형식을 요.yyyy-MM-dd HH:mm:ss.SSS 코드를

final String OLD_FORMAT = "yyyy-MM-dd";
final String NEW_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
String oldDateString = createdArray[k];
String newDateString;

DateFormat formatter = new SimpleDateFormat(OLD_FORMAT);
Date d = formatter.parse(oldDateString);
((SimpleDateFormat) formatter).applyPattern(NEW_FORMAT);
newDateString = formatter.format(d);
System.out.println(newDateString);

Timestamp ts = Timestamp.valueOf(newDateString);
System.out.println(ts);

그리고 다음과 같은 결과를 얻습니다.

2009-10-20 00:00:00.000

2009-10-20 00:00:00.0

제가 간단하게 하려고 할 때론

String text = "2011-10-02 18:48:05.123";
ts = Timestamp.valueOf(text);
System.out.println(ts);

올바른 결과를 얻을 수 있습니다.

2011-10-02 18:48:05.123

내가 뭘 잘못하고 있는 줄 알아?도와 주셔서 감사해요.

올바른 결과를 얻으려면 다음 단계를 수행하십시오.

try {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    Date parsedDate = dateFormat.parse(yourString);
    Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());
} catch(Exception e) { //this generic but you can control another types of exception
    // look the origin of excption 
}

그럼 가 느려질 수 있습니다.

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Util {
  public static Timestamp convertStringToTimestamp(String strDate) {
    try {
      DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
       // you can change format of date
      Date date = formatter.parse(strDate);
      Timestamp timeStampDate = new Timestamp(date.getTime());

      return timeStampDate;
    } catch (ParseException e) {
      System.out.println("Exception :" + e);
      return null;
    }
  }
}

하다이 때 2013년 질문을 Timestamp예를 들어 데이터베이스에 날짜 시간을 저장하는 데 적합한 클래스입니다.오늘 수업은 오래되었다.최신 Java 날짜 및 시각 API는 3년 반 전인 2014년 봄에 Java 8과 함께 출시되었습니다.이치노

자연 방법이 .Timestamp:

  • Instant타임라인상의 포인트입니다.대부분의 경우, 저는 이것을 사용하는 것이 가장 안전하다고 생각합니다.Instant는 타임존과는 무관하며 클라이언트 디바이스와 데이터베이스 서버가 다른 타임존을 실행하고 있는 상황에서도 정상적으로 동작합니다.
  • LocalDateTime는 2011-10-02 18:48:05.123(질문을 인용)과 같이 시간대가 없는 날짜와 시간입니다.

을 위한 드라이버 4.2 ) 및은 JDBC 4.2 중 합니다.Instant ★★★LocalDateTime type의 합니다.timestamp. 이 클래스는 이러한 클래스는 최신 API로 알려져 있습니다.java.time© JSR-310

이 가장 요.LocalDateTime그럼 먼저 이 점을 살펴보겠습니다.

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSS");
    String text = "2011-10-02 18:48:05.123";
    LocalDateTime dateTime = LocalDateTime.parse(text, formatter);
    System.out.println(dateTime);

이 인쇄물은

2011-10-02T18:48:05.123

문자열이 yyy-MM-dd 형식일 경우 대신 다음을 수행합니다.

    String text = "2009-10-20";
    LocalDateTime dateTime = LocalDate.parse(text).atStartOfDay();
    System.out.println(dateTime);

이 인쇄물은

2009-10-20T00:00

보다 것은, 는 from from from from from from의 입니다.LocalDate.parse()합니다.date.

, 「」로부터 .LocalDateTime Instant 말합니다

    Instant ts = dateTime.atZone(ZoneId.systemDefault()).toInstant();
    System.out.println(ts);

JVM의 기본 시간대를 사용하여 변환을 지정했습니다. 오래된 클래스에서 변환이 사용되기 때문입니다.다만, 타임 존의 설정은, 프로그램의 다른 부분이나 같은 JVM으로 실행되고 있는 다른 프로그램에 의해서 변경되는 일이 있기 때문에, 취약합니다.가능한 경우 지역/도시 형식으로 시간대를 지정합니다.다음은 예를 제시하겠습니다.

    Instant ts = dateTime.atZone(ZoneId.of("Europe/Athens")).toInstant();

String을 java.sql로 쉽게 변환할 수 있습니다.타임스탬프:

Timestamp t = new Timestamp(DateUtil.provideDateFormat().parse("2019-01-14T12:00:00.000Z").getTime());

Date Util.java:

import java.text.SimpleDateFormat;
import java.util.TimeZone;

public interface DateUtil {

  String ISO_DATE_FORMAT_ZERO_OFFSET = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
  String UTC_TIMEZONE_NAME = "UTC";

  static SimpleDateFormat provideDateFormat() {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(ISO_DATE_FORMAT_ZERO_OFFSET);
    simpleDateFormat.setTimeZone(TimeZone.getTimeZone(UTC_TIMEZONE_NAME));
    return simpleDateFormat;
  }
}
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");

Date date = formatter.parse(dateString);

Timestamp timestamp = new Timestamp(date.getTime());

System.out.println(timestamp);

완전성을 위해 람다와 방법 참조를 포함한 솔루션을 다음에 제시합니다.

ISO 포맷?

설명:다음 방법

  • 변환하다String패턴에 따라yyyy-MM-ddTimestamp유효한 입력이 입력된 경우,
  • a를 반환하다null, 만약null값이 지정됩니다.
  • 던지다DateTimeParseException비활성 입력이 입력된 경우

코드:

static Timestamp convertStringToTimestamp(String strDate) {
    return Optional.ofNullable(strDate) // wrap the String into an Optional
                   .map(str -> LocalDate.parse(str).atStartOfDay()) // convert into a LocalDate and fix the hour:minute:sec to 00:00:00
                   .map(Timestamp::valueOf) // convert to Timestamp
                   .orElse(null); // if no value is present, return null
}


검증:이 방법은 다음 유닛 테스트로 테스트할 수 있습니다(Junit5Hamcrest 사용).

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
    // given
    String strDate = "2020-01-30";

    // when
    final Timestamp result = convertStringToTimestamp(strDate);

    // then
    final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
    assertThat(dateTime.getYear(), is(2020));
    assertThat(dateTime.getMonthValue(), is(1));
    assertThat(dateTime.getDayOfMonth(), is(30));
}

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenInvalidInput() {
    // given
    String strDate = "7770-91-30";

    // when, then
    assertThrows(DateTimeParseException.class, () -> convertStringToTimestamp(strDate));
}

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenNullInput() {
    // when
    final Timestamp result = convertStringToTimestamp(null);

    // then
    assertThat(result, is(nullValue()));
}


다른 포맷?

통상은, 해석하는 문자열에는 다른 형식이 붙어 있습니다.이 문제를 해결하는 방법은 포맷터를 사용하여 다른 포맷으로 변환하는 것입니다.다음은 예를 제시하겠습니다.

입력:20200130 11:30

패턴:yyyyMMdd HH:mm

출력: 이 입력의 타임스탬프

코드:

static Timestamp convertStringToTimestamp(String strDate) {
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm");
    return Optional.ofNullable(strDate) //
                   .map(str -> LocalDateTime.parse(str, formatter))
                   .map(Timestamp::valueOf) //
                   .orElse(null);
}

테스트:

@Test
void convertStringToTimestamp_shouldReturnTimestamp_whenValidInput() {
    // given
    String strDate = "20200130 11:30";

    // when
    final Timestamp result = convertStringToTimestamp(strDate);

    // then
    final LocalDateTime dateTime = LocalDateTime.ofInstant(result.toInstant(), ZoneId.systemDefault());
    assertThat(dateTime.getYear(), is(2020));
    assertThat(dateTime.getMonthValue(), is(1));
    assertThat(dateTime.getDayOfMonth(), is(30));
    assertThat(dateTime.getHour(), is(11));
    assertThat(dateTime.getMinute(), is(30));
}
DateFormat formatter;
formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date = (Date) formatter.parse(str_date);
java.sql.Timestamp timeStampDate = new Timestamp(date.getTime());

제가 한 일은 다음과 같습니다.

Timestamp timestamp = Timestamp.valueOf(stringValue);

어디에stringValue에는 임의의 형식의 날짜/시간을 지정할 수 있습니다.

먼저 날짜 문자열을 로 변환합니다.date다음으로 변환합니다.timestamp다음 일련의 행을 사용하여

Date date=new Date();
Timestamp timestamp = new Timestamp(date.getTime());//instead of date put your converted date
Timestamp myTimeStamp= timestamp;

그 해결책은 oldDateString이 "2009-10-20"과 같은 것이라고 확신합니다.분명히 여기에는 일 미만의 시간 데이터가 포함되어 있지 않습니다.이 문자열을 새로운 포맷터로 포맷할 경우 분, 초, 밀리초를 어디서 얻을 수 있습니까?

따라서 결과는 완전히 정확합니다: 2009-10-20 00:00:00.000

이 문제를 해결하려면 첫 번째 포맷 전에 원래 타임스탬프(시간 데이터 포함)가 필요합니다.

한 번 시도해 볼 수 있어?

String dob="your date String";
String dobis=null;
final DateFormat df = new SimpleDateFormat("yyyy-MMM-dd");
final Calendar c = Calendar.getInstance();
try {
    if(dob!=null && !dob.isEmpty() && dob != "")
    {
    c.setTime(df.parse(dob));
    int month=c.get(Calendar.MONTH);
    month=month+1;
    dobis=c.get(Calendar.YEAR)+"-"+month+"-"+c.get(Calendar.DAY_OF_MONTH);
    }

}

언급URL : https://stackoverflow.com/questions/18915075/java-convert-string-to-timestamp

반응형