我有这段代码:
DateFormat formatter1;
formatter1 = new SimpleDateFormat("mm/DD/yyyy");
System.out.println((Date)formatter1.parse("08/16/2011"));
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我将其作为输出:
Sun Jan 16 00:10:00 IST 2011
Run Code Online (Sandbox Code Playgroud)
我期望:
Tue Aug 16 "Whatever Time" IST 2011
Run Code Online (Sandbox Code Playgroud)
我的意思是说我没有达到预期的月份.这是什么错误?
码:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss z");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println(new Date());
try {
String d = sdf.format(new Date());
System.out.println(d);
System.out.println(sdf.parse(d));
} catch (Exception e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
Run Code Online (Sandbox Code Playgroud)
输出:
Thu Aug 08 17:26:32 GMT+08:00 2013
2013.08.08 09:26:32 GMT
Thu Aug 08 17:26:32 GMT+08:00 2013
Run Code Online (Sandbox Code Playgroud)
请注意,format()
格式Date
正确格式为GMT,但parse()
丢失了GMT详细信息.我知道我可以使用substring()
并解决这个问题,但这种现象背后的原因是什么?
这是一个重复的问题,没有任何答案.
编辑:让我以另一种方式提出问题,检索Date对象的方式是什么,以便它始终在GMT中?
我试过了
DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy");
Date d = fmt.parse("June 27, 2007");
Run Code Online (Sandbox Code Playgroud)
Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"
java文档说我应该使用四个字符来匹配完整的表单.我只能使用像"Jun"这样的缩写月份成功使用MMM,但我需要匹配完整的表格.
文本:对于格式化,如果模式字母的数量为4或更多,则使用完整形式; 否则,如果可用,则使用简短或缩写形式.对于解析,两种形式都被接受,与模式字母的数量无关.
http://java.sun.com/j2se/1.6.0/docs/api/java/text/SimpleDateFormat.html
我正在尝试解析文档中出现的一些日期.看起来用户已经以类似但不精确的格式输入这些日期.
以下是格式:
9/09
9/2009
09/2009
9/1/2009
9-1-2009
Run Code Online (Sandbox Code Playgroud)
尝试解析所有这些问题的最佳方法是什么?这些似乎是最常见的,但我想是什么让我感到高兴的是,如果我有一个"M/yyyy"模式,那么总是会在"MM/yyyy"之前捕获我是否必须设置我的try/catch块嵌套在限制最少的限制性方式?似乎肯定会采取大量代码重复来实现这一目标.
我在遗留应用程序中有代码和测试用例,可归纳如下:
@Test
public void testParseDate() throws ParseException {
String toParse = "Mo Aug 18 11:25:26 MESZ +0200 2014";
String pattern = "EEE MMM dd HH:mm:ss z Z yyyy";
DateFormat dateFormatter = new SimpleDateFormat(pattern, Locale.GERMANY);
Date date = dateFormatter.parse(toParse);
//skipped assumptions
}
Run Code Online (Sandbox Code Playgroud)
该测试通过Java 8及以下版本.然而,随着Java 10向上,这导致了一个java.text.ParseException: Unparseable date: "Mo Aug 18 11:25:26 MESZ +0200 2014"
.
备案:另外de_DE
,异常也抛出了语言环境
de_CH
,de_AT
,de_LU
.
我知道使用JDK 9(JEP 252)更改了日期格式.但是,我认为这是破坏向后兼容性的颠覆性变化.摘录:
在JDK 9中,Unicode Consortium的公共区域设置数据存储库(CLDR)数据作为默认区域设置数据启用,因此您可以使用标准区域设置数据而无需任何进一步操作.
在JDK …
我想要以毫秒为单位的当前时间然后以12小时格式存储它,但是使用这段代码我得到24小时格式时间.
long timeInMillis = System.currentTimeMillis();
Calendar cal1 = Calendar.getInstance();
cal1.setTimeInMillis(timeInMillis);
SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy HH:mm:ss a");
dateforrow = dateFormat.format(cal1.getTime());
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出修改以获得理想的结果?
我正在尝试将yyyy-MM-dd'T'HH:mm:ss.SSSz格式的日期格式化为yyyy-mm-dd HH:mm:ss,这应该很容易,但我不能让它工作.
必须解析的日期格式为:2012-10-01T09:45:00.000 + 02:00
现在我使用这个简单的日期格式化程序来格式化它:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSz", Locale.FRANCE);
Run Code Online (Sandbox Code Playgroud)
但是这给出了类似于2012-10-01T09的输出:45:00.000UTC + 00:00.
我也尝试使用"yyyy-MM-dd'T'HH:mm:ss.SSSZ"作为模式和"yyyy-MM-ddHH:mm:ss".后者以2012-10-01T09:45:00的形式返回日期,但尚未结束.
我认为将T分离出来会有点乱,并且无缘无故地创造开销,那么格式化这些日期的正确方法是什么?
为了说明我想将2012-10-01T09:45:00.000 + 02:00转换成2012-10-01 09:45:00
干杯!
我在尝试使用代码时正在解析异常
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Run Code Online (Sandbox Code Playgroud)
例外
String date="Sat Jun 01 12:53:10 IST 2013";
SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss");
Date currentdate;
currentdate=sdf.parse(date);
System.out.println(currentdate);
Run Code Online (Sandbox Code Playgroud)
输入:Sat Jun 01 12:53:10 IST 2013
预期产量:Jun 01,2013 12:53:10
怎么解决这个?
我Service
从网上获取日期字符串,然后我想把它削减到Date
对象.但不知何故应用程序崩溃.这是我正在解析的字符串:2015-02-05T05:20:02+00:00
onStartCommand()
String datetime = "2015-02-05T05:20:02+00:00";
Date new_date = stringToDate(datetime);
Run Code Online (Sandbox Code Playgroud)
stringToDate()
private Date stringToDate(String s){
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
try{
return df.parse(s);
}catch(ParseException e){
e.printStackTrace();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
logcat的:
02-06 20:37:02.008: E/AndroidRuntime(28565): FATAL EXCEPTION: main
02-06 20:37:02.008: E/AndroidRuntime(28565): Process: com.dotmav.runescapenotifier, PID: 28565
02-06 20:37:02.008: E/AndroidRuntime(28565): java.lang.RuntimeException: Unable to start service com.dotmav.runescapenotifier.GEService@384655b5 with Intent { cmp=com.dotmav.runescapenotifier/.GEService }: java.lang.IllegalArgumentException: Unknown pattern character 'X'
02-06 20:37:02.008: E/AndroidRuntime(28565): at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2881)
02-06 20:37:02.008: E/AndroidRuntime(28565): at android.app.ActivityThread.access$2100(ActivityThread.java:144)
02-06 20:37:02.008: …
Run Code Online (Sandbox Code Playgroud) 我正在读日期字符串,可能有或没有时区调整:yyyyMMddHHmmssz
或yyyyMMddHHmmss
.当一个字符串缺少一个区域时,我将其视为GMT.我没有看到任何方式在a中创建可选部分SimpleDateFormat
,但也许我错过了一些东西.有没有办法用a做这个SimpleDateFormat
,或者我应该写一个新的具体DateFormat
来处理这个?
java ×10
simpledateformat ×10
date ×3
datetime ×3
android ×2
parsing ×2
date-format ×1
gmt ×1
java-10 ×1
java-8 ×1
java-9 ×1
localization ×1