例如:
Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );
Run Code Online (Sandbox Code Playgroud)
打印1
Joda时间也是如此.
:)
最简单的方法:
String[] namesOfDays = new String[7] {
"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"
};
Run Code Online (Sandbox Code Playgroud)
此方法不使用Locale.因此,如果系统的语言不是英语,则此方法无法正常工作.
使用Joda时间,我们可以这样做:
String[] namesOfDays = new String[7];
LocalDate now = new LocalDate();
for (int i=0; i<7; i++) {
/* DateTimeConstants.MONDAY = 1, TUESDAY = 2, ..., SUNDAY = 7 */
namesOfDays[i] = now.withDayOfWeek((DateTimeConstants.SUNDAY + i - 1) % 7 + 1)
.dayOfWeek().getAsShortText();
}
Run Code Online (Sandbox Code Playgroud)
但是,此方法使用今天的日期和日历计算,这对于最终目的而言是无用的.而且,它有点复杂.
是否有一个简单的方法来得到这样的字符串"Sun","Mon",...,"Sat"用系统的默认语言环境?
我需要为很多用户安排定期工作.此作业将以固定速率运行,间隔时间.我希望在该时间间隔内统一分配每个用户的作业执行.例如,如果间隔是4天,我将使用一致的散列函数和每个用户的标识符来同时安排作业,例如.每隔4天,第3天.
间隔是相对于所有用户都相同的原始时刻.给定这样的原点瞬间,像Instant#EPOCH或其他一些常数值,如何找到当前间隔的开始日期?
我可以
Instant now = Instant.now();
Instant origin = Instant.EPOCH;
Duration interval = Duration.ofDays(4);
Duration duration = Duration.between(origin, now);
long sinceOrigin = duration.toMillis();
long millisPerInterval = interval.toMillis();
long intervalsSince = sinceOrigin / millisPerInterval;
Instant startNext = origin.plus(interval.multipliedBy(intervalsSince));
int cursor = distributionStrategy.distribute(hashCode, millisPerInterval);
Run Code Online (Sandbox Code Playgroud)
然后我可以使用它cursor来调度Instant相对于当前间隔开始的作业.
这里有很多数学,我不确定在任何地方转换到毫秒都会维持实际日期.是否有更精确的方法来划分两个时刻之间的时间并找到我们目前所处的那一个(细分)?
我最近遇到了date4j,这是一个非常简单的库(基本上是一个单独的类),用于处理Java中的日期.从概念上讲,我非常喜欢date4j的"想法".实际上,在阅读了整个主站点和javadoc中的文档之后,我几乎同意所说的一切.
现在,可能有几个原因我不应该使用date4j - 错误,性能,缺乏用户等.我不是在问这些事情.从概念上讲,我问的是date4j的概念有什么问题(对于那里的大多数应用程序而言)?当然,可能有一些应用程序需要像joda或threeten这样的东西 - 但我相信这些应用程序属于少数.
人们给处理日期/时间的用户提供的正常建议(几乎所有人都在编写Java应用程序)是这样的:
实际上,最后三个要点说明了人们在使用日期时当前的心理模型存在的问题.人们试图在应用程序和数据库级别管理时区(更不用说ORM框架添加了另一层抽象,这使得事情变得更加复杂).
你不应该做那些事情.例如,如果您正在使用java.util.Calendar,并且您正在某个用户定义的时区中操作时间:
Calendar c = Calendar.getInstance(TimeZone.getTimeZone("America/New_York"));
c.set(Calendar.YEAR, 2011);
c.set(Calendar.MONTH, 0);
c.set(Calendar.DAY_OF_MONTH, 1);
c.set(Calendar.HOUR_OF_DAY, 3);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Run Code Online (Sandbox Code Playgroud)
无论时区如何,这都代表了"瞬间".您应该能够将此时间保留在数据库中,而不必担心会发生任何类型的"转换".如果数据库位于上海时区并且网络服务器位于洛杉矶时区也无关紧要 - 无论如何,时刻都是相同的.
一个问题是一些数据库试图为你管理时区(我正在看你,Postgres!grr!)并且更糟糕的是,JDBC驱动程序级别的行为是供应商特定的 - 即PreparedStatement.setDate/getDate.
date4j使用的心理模型似乎摆脱了所有的混乱.例如,显式强制用户在调用now()时提供时区.在网站上有一些非常好的建议来使用这个库(这些我以前在我自己的应用程序中已经做过的事情),例如:
为什么没有更多的人采用像date4j这样的图书馆?
当Apple从App Store返回自动续订订阅的收据时,Apple使用Etc/GMT时区的理由是什么?
Etc/GMT时区到底是什么时候?Java SDK是否了解此时区?或者我是否必须使用其他第三方库,如Joda-Time?
如何圆DateTime的Joda库到最近X分钟?
例如:
X = 10 minutes Jun 27, 11:32 -> Jun 27, 11:30 Jun 27, 11:33 -> Jun 27, 11:30 Jun 27, 11:34 -> Jun 27, 11:30 Jun 27, 11:35 -> Jun 27, 11:40 Jun 27, 11:36 -> Jun 27, 11:40 Jun 27, 11:37 -> Jun 27, 11:40
目前,要从当地时区1970年开始获得毫秒,我做到了
long localMillis = dateTime.withZone(timeZone).toLocalDateTime()
.toDateTime(DateTimeZone.UTC).getMillis();
Run Code Online (Sandbox Code Playgroud)
这有效,但有更简单的方法吗?
如何获得以下格式:
2015-01-31T00:00:00Z
Run Code Online (Sandbox Code Playgroud)
(ISO8601 GMT日期格式)
在joda时间(java)中的DateTime对象?例如.
DateTime time = DateTime.now();
String str = // Get something like 2012-02-07T00:00:00Z
Run Code Online (Sandbox Code Playgroud)
谢谢!:)
我想以UTC格式获取当前时间.到目前为止我所做的是(仅用于测试目的):
DateTime dt = new DateTime();
DateTimeZone tz = DateTimeZone.getDefault();
LocalDateTime nowLocal = new LocalDateTime();
DateTime nowUTC = nowLocal.toDateTime(DateTimeZone.UTC);
Date d1 = nowLocal.toDate();
Date d2 = nowUTC.toDate();
L.d("tz: " + tz.toString());
L.d("local: " + d1.toString());
L.d("utc: " + d2.toString());
Run Code Online (Sandbox Code Playgroud)
d1 是我当地的时间,没关系d2 是我当地时间+ 1,但应该是当地时间 - 1 ...我的本地时区是UTC + 1(根据调试输出和列表:https://www.joda.org/joda-time/timezones.html)...
如何正确地从一个时区转换为另一个时区(包括毫秒表示)?
编辑
我需要日期/毫秒...这不是关于正确显示时间....
编辑2
现在,在评论和答案的帮助下,我尝试了以下内容:
DateTimeZone tz = DateTimeZone.getDefault();
DateTime nowLocal = new DateTime();
LocalDateTime nowUTC = nowLocal.withZone(DateTimeZone.UTC).toLocalDateTime();
DateTime nowUTC2 = nowLocal.withZone(DateTimeZone.UTC);
Date dLocal = nowLocal.toDate(); …Run Code Online (Sandbox Code Playgroud)