我想将此转换(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的新手。
答案 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)
感谢 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.time
,modern 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 desugaring 和 How to use ThreeTenABP in Android Project。