将字符串中的日期(Mon Jan 16:20:12 India Standard Time 2014)转换为JAVA中的java.util.date

时间:2014-01-13 11:05:26

标签: java date mfc datetime-format

我想将此转换(Mon Jan 16:20:12 India Standard Time 2014)字符串中的日期到java中的java.util.Date我该怎么办呢。我希望日期格式如下。

SimpleDateFormat formatter = new SimpleDateFormat(
                "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);

实际上日期(2014年1月16日20:20印度标准时间)是来自MFC应用程序的参数,该应用程序将启动可执行jar文件,字符串中的日期将是其参数。将启动可执行jar的MFC代码。与争论。

CString csCurrentTime = CTime::GetCurrentTime().Format("%a %b %X %Z %Y");
    TRACE(csCurrentTime);
    if (CreateProcess(m_csJrePath, TEXT(" -jar DbxUpldDwnld.jar %s",csCurrentTime), NULL, NULL, false, CREATE_NO_WINDOW, NULL, NULL, (LPSTARTUPINFOA)&siStartupInfo, &piProcessInfo) == false) {
        AfxMessageBox(_T("Please install Java Runtime Environment(JRE) on your PC\n Or JRE not found on given path in INI File."), MB_ICONERROR);
        CloseHandle(piProcessInfo.hProcess);
        CloseHandle(piProcessInfo.hThread);
        return;
    }

也可以在java中将带空格的日期作为单个参数。 请帮助我,我是MFC的新手。

2 个答案:

答案 0 :(得分:3)

您需要使用具有时间字符串格式的其他SimpleDateFormat来进行解析。对于你的例子,这个应该工作:

String time = "Mon Jan 16:20:12 India Standard Time 2014";
SimpleDateFormat parser = new SimpleDateFormat("E MMM HH:mm:ss z yyyy", Locale.US);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
System.out.println(formatter.format(parser.parse(time)));

正如@TimB所指出的,所有日期和时间模式都可以在the JavaDoc for SimpleDateFormat中找到。

答案 1 :(得分:1)

java.time

更新:

感谢 Ole V.V.

对于更通用的解决方案,将 .parseDefaulting(ChronoField.DAY_OF_MONTH, date.getDayOfMonth()) 替换为 .parseDefaulting(ChronoField.ALIGNED_WEEK_OF_MONTH, 1),这也将通过消除首先获得 LocalDate 的需要来简化解决方案。

演示:

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.time.temporal.ChronoField;
import java.util.Locale;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()                              
                                .appendPattern("E MMM H:m:s")
                                .appendLiteral(' ')
                                .appendZoneText(TextStyle.FULL)
                                .appendLiteral(' ')
                                .appendPattern("u")
                                .parseDefaulting(ChronoField.ALIGNED_WEEK_OF_MONTH, 1)                                
                                .toFormatter(Locale.ENGLISH);

        // Test
        Stream.of(
                    "Mon Jan 16:20:12 India Standard Time 2014",
                    "Mon Feb 16:20:12 India Standard Time 2014"
        ).forEach(s -> System.out.println(ZonedDateTime.parse(s, dtf)));
    }        
}

输出:

2014-01-06T16:20:12+05:30[Asia/Kolkata]
2014-02-03T16:20:12+05:30[Asia/Kolkata]

原答案:

旧的日期时间 API(java.util 日期时间类型及其格式 API,SimpleDateFormat)已经过时且容易出错。建议完全停止使用,改用java.timemodern date-time API*

使用现代 API 的解决方案:

您的日期时间字符串没有日期。这意味着您需要为 DateTimeFormatter 提供月份中的某一天,您可以使用 DateTimeFormatterBuilder#parseDefaulting 来实现。为了获得当月的第一个星期一,惯用的方法是使用TemporalAdjusters.firstInMonth

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.Month;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.TextStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "Mon Jan 16:20:12 India Standard Time 2014";

        LocalDate date = LocalDate.of(2014, Month.JANUARY, 1)
                                .with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));

        DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                .parseCaseInsensitive()
                                .parseDefaulting(ChronoField.DAY_OF_MONTH, date.getDayOfMonth())
                                .appendPattern("E MMM H:m:s")
                                .appendLiteral(' ')
                                .appendZoneText(TextStyle.FULL)
                                .appendLiteral(' ')
                                .appendPattern("u")
                                .toFormatter(Locale.ENGLISH);

        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, dtf);
        System.out.println(zdt);
    }
}

输出:

2014-01-06T16:20:12+05:30[Asia/Kolkata]

出于任何原因,如果您需要将 ZonedDateTime 的这个对象转换为 java.util.Date 的对象,您可以这样做:

Date date = Date.from(zdt.toInstant());

modern date-time API 中了解有关 Trail: Date Time* 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project