我有这个日期对象:
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm");
Date d1 = df.parse(interviewList.get(37).getTime());
Run Code Online (Sandbox Code Playgroud)
d1的值是 Fri Jan 07 17:40:00 PKT 2011
现在我想在上面的日期添加10分钟.
Calendar cal = Calendar.getInstance();
cal.setTime(d1);
cal.add(Calendar.MINUTE, 10);
String newTime = df.format(cal.getTime());
Run Code Online (Sandbox Code Playgroud)
newTime改变的价值2011-50-07 17:50
但应该是07-01-2011 17:50.
它正确添加分钟但它也会改变月份,不知道为什么!
SimpleDateFormat的javadoc声明SimpleDateFormat未同步.
"日期格式不同步.建议为每个线程创建单独的格式实例.如果多个线程同时访问格式,则必须在外部同步."
但是在多线程环境中使用SimpleDateFormat实例的最佳方法是什么.以下是我想到的一些选项,我过去使用过选项1和2,但我很想知道是否有更好的替代方案或哪些选项可以提供最佳性能和并发性.
选项1:在需要时创建本地实例
public String formatDate(Date d) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
Run Code Online (Sandbox Code Playgroud)
选项2:将SimpleDateFormat的实例创建为类变量,但同步对其的访问.
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
public String formatDate(Date d) {
synchronized(sdf) {
return sdf.format(d);
}
}
Run Code Online (Sandbox Code Playgroud)
选项3:创建ThreadLocal以为每个线程存储SimpleDateFormat的不同实例.
private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>();
public String formatDate(Date d) {
SimpleDateFormat sdf = tl.get();
if(sdf == null) {
sdf = new SimpleDateFormat("yyyy-MM-hh");
tl.set(sdf);
}
return sdf.format(d);
}
Run Code Online (Sandbox Code Playgroud) 我想知道为什么'Y'会回归2012而'y'会在2011年回归SimpleDateFormat:
System.out.println(new SimpleDateFormat("Y").format(new Date())); // prints 2012
System.out.println(new SimpleDateFormat("y").format(new Date())); // prints 2011
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释原因吗?
我正在尝试基于给定的语言环境以不同的方式在Java中格式化日期.例如,我希望英语用户看到"2009年11月1日"(由"MMM d,yyyy"格式化)和挪威用户看到"1. nov.2009"("d.MMM.yyyy").
如果我将语言环境添加到SimpleDateFormat构造函数中,那么月份部分可以正常工作,但其余部分呢?
我希望我可以将与locales配对的格式字符串添加到SimpleDateFormat,但我找不到任何方法来执行此操作.是否可以或者我是否需要让我的代码检查语言环境并添加相应的格式字符串?
我试图解析一个看起来像这样的日期:
yyyy-MM-dd'T'HH:mm:ss
Run Code Online (Sandbox Code Playgroud)
这是http://www.ietf.org/rfc/rfc3339.txt的有效日期."Z"字面意思"暗示UTC是指定时间内的首选参考点."
如果我尝试使用SimpleDateFormat和此模式解析它:
yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssZ
Run Code Online (Sandbox Code Playgroud)
它将被解析为2010年4月5日17:16:00美国东部时间2010年
SimpleDateFormat无法使用以下模式解析字符串:
yyyy-MM-dd'T'HH:mm:ss
Run Code Online (Sandbox Code Playgroud)
我可以显式设置TimeZone在SimpleDateFormat上使用以获得预期的输出,但我不认为这是必要的.有什么我想念的吗?有替代日期解析器吗?
我可以通过这种方式将a转换java.util.Date为java.time.Instant(Java 8及更高版本):
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 8);
cal.set(Calendar.MINUTE, 30);
Date startTime = cal.getTime();
Instant i = startTime.toInstant();
Run Code Online (Sandbox Code Playgroud)
有人能告诉我有关特定日期和时间格式的即时转换吗?即2015-06-02 8:30:00
我已经通过api但找不到满意的答案.
是否可以在SimpleDateFormat模式字符串中包含字母字符?
我正在尝试创建一个格式字符串,其中字母"T"包含在时间之前,例如:
2003-11-15 T 09:30:47-05:00
我目前正在使用yyyy-MM-ddhh:mm:ssZ模式字符串.
如果我将其更改为yyyy-MM-ddThh:mm:ssZ它将抛出一个例外,'A'为'Z','a'为'z'保留.
是否有任何解决方案不涉及使用两个DateFormats?
任何人都可以告诉我SimpleDateFormat类中可用的日期格式.
我已经通过api但找不到满意的答案.非常感谢任何帮助.
我有GregorianCalendar实例,需要使用SimpleDateFormat(或者可以用于日历,但提供所需的#fromat()功能)以获得所需的输出.请建议解决方案和永久解决方案一样好.
格式化日期后我显示时间显示上午或下午(大写)我希望它在小写像上午,下午这是我的代码
public class Timeis {
public static void main(String s[]) {
long ts = 1022895271767L;
String st = null;
st = new SimpleDateFormat(" MMM d 'at' hh:mm a").format(ts);
System.out.println("time is " + ts);
}
}
Run Code Online (Sandbox Code Playgroud) java ×10
simpledateformat ×10
date ×6
datetime ×4
calendar ×2
formatting ×2
concurrency ×1
java-8 ×1
locale ×1
parsing ×1
timezone ×1