标签: jodatime

为什么2010年12月31日将作为一年中的一周返回1?

例如:

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时间也是如此.

:)

java calendar jodatime week-number

26
推荐指数
3
解决办法
2万
查看次数

将JodaTime持续时间转换为字符串

我的电影持续时间为127秒.我想把它显示为02:07.实现这个的最佳方法是什么?

duration jodatime

26
推荐指数
2
解决办法
1万
查看次数

在Java中,如何使用系统的默认语言环境(语言)获取星期几(星期日,星期一,...,星期六)的字符串

最简单的方法:

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"用系统的默认语言环境?

java android calendar jodatime dayofweek

26
推荐指数
2
解决办法
3万
查看次数

如何将时间段划分为相等的时间间隔并找到当前时间段?

我需要为很多用户安排定期工作.此作业将以固定速率运行,间隔时间.我希望在该时间间隔内统一分配每个用户的作业执行.例如,如果间隔是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相对于当前间隔开始的作业.

这里有很多数学,我不确定在任何地方转换到毫秒都会维持实际日期.是否有更精确的方法来划分两个时刻之间的时间并找到我们目前所处的那一个(细分)?

java jodatime java-time

26
推荐指数
3
解决办法
3943
查看次数

为什么我不应该使用date4j而不是joda java.util.Calendar或jsr 310?

我最近遇到了date4j,这是一个非常简单的库(基本上是一个单独的类),用于处理Java中的日期.从概念上讲,我非常喜欢date4j的"想法".实际上,在阅读了整个主站点和javadoc中的文档之后,我几乎同意所说的一切.

现在,可能有几个原因我不应该使用date4j - 错误,性能,缺乏用户等.我不是在问这些事情.从概念上讲,我问的是date4j的概念有什么问题(对于那里的大多数应用程序而言)?当然,可能有一些应用程序需要像joda或threeten这样的东西 - 但我相信这些应用程序属于少数.

人们给处理日期/时间的用户提供的正常建议(几乎所有人都在编写Java应用程序)是这样的:

  • 使用joda-time而不是java.util.Calendar
  • 将您的Web服务器设置为UTC
  • 将数据库服务器设置为UTC
  • 将您的日期时间存储在UTC中

实际上,最后三个要点说明了人们在使用日期时当前的心理模型存在的问题.人们试图在应用程序和数据库级别管理时区(更不用说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这样的图书馆?

java timezone jodatime java.util.date

25
推荐指数
1
解决办法
4036
查看次数

了解Etc/GMT时区

当Apple从App Store返回自动续订订阅的收据时,Apple使用Etc/GMT时区的理由是什么?

Etc/GMT时区到底是什么时候?Java SDK是否了解此时区?或者我是否必须使用其他第三方库,如Joda-Time

java iphone timezone jodatime app-store

25
推荐指数
3
解决办法
3万
查看次数

如何将Joda图书馆的DateTime舍入到最近的X分钟?

如何圆DateTimeJoda库到最近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

java datetime jodatime

25
推荐指数
5
解决办法
2万
查看次数

使用Joda-Time在时区中获取本地毫秒的最简单方法

目前,要从当地时区1970年开始获得毫秒,我做到了

long localMillis = dateTime.withZone(timeZone).toLocalDateTime()
    .toDateTime(DateTimeZone.UTC).getMillis();
Run Code Online (Sandbox Code Playgroud)

这有效,但有更简单的方法吗?

jodatime

25
推荐指数
2
解决办法
3万
查看次数

JodaTime DateTime,ISO8601 GMT日期格式

如何获得以下格式:

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)

谢谢!:)

java jodatime

25
推荐指数
3
解决办法
3万
查看次数

JodaTime - 如何获得UTC的当前时间

我想以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)

java jodatime

24
推荐指数
3
解决办法
5万
查看次数