解析月份名称并创建日期范围

时间:2014-02-13 09:02:47

标签: scala date jodatime

鉴于当前年份和完整字符串格式(“4月”)的任意月份,如何创建本月的日期范围?例如,如果我给了“june”,我想创建 date1 = "2014-06-01"和d ate2 = "2014-06-31"。我试着解析一个月:

DateTime.parse("january")
DateTime.parse("2014-january")
DateTime.parse("2014-january-01")

但它导致错误说它的论点是错误的。我可以使用另一个重载版本的解析,但由于它的DateTimeFormatter参数我不知道如何使用,结果很难。

我可以创建一个包含所有月份和天数的地图,但由于Joda-Time有一个标准的方法,我决定不这样做。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

import org.joda.time.format.DateTimeFormat
import org.joda.time.DateTime
import java.util.Locale

val dt = "2014-january-01"
val df = DateTimeFormat.forPattern("yyyy-MMMMM-dd").withLocale(Locale.US)
DateTime.parse(dt, df)

这会给你:

res16: org.joda.time.DateTime = 2014-01-01T00:00:00.000+02:00

然后,您可以这样做:

val start = res16.dayOfMonth.withMinimumValue
val end = res16.dayOfMonth.withMaximumValue

答案 1 :(得分:2)

我不熟悉scala,但因为它是JVM,我会试一试,如果我犯了任何语法错误,请更正我:

var strDate = "January"
var format = DateTimeFormat.forPattern("MMM")
var date = format.parseDateTime(strDate)
println(date)

var monthStart = new DateTime().withYear(2014).withMonthOfYear(date.getMonthOfYear()).withDayOfMonth(date.dayOfMonth().getMinimumValue())
var monthEnd = new DateTime().withYear(2014).withMonthOfYear(date.getMonthOfYear()).withDayOfMonth(date.dayOfMonth().getMaximumValue())

println("Month Start : " + monthStart)
println("Month End : " + monthEnd)

如果没有这一年,jodatime将默认为2000,因此在设置monthStartmonthEnd时我明确将其设置为2014年。

在Java中,我得到的输出如下:

Month Start : 2014-01-01T15:00:26.174+05:30
Month End : 2014-01-31T15:00:26.179+05:30

让我知道它是怎么回事!

答案 2 :(得分:1)

显然,如果您可以传递一个月的数字而不是本地化的月份名称会更好。但是如果你无法改变它,那么我们使用Joda-Time 2.3在Java中使用一些示例代码。

您必须自行调整Scala的语法。

我的代码灵感来自answer by PopoFibo

DateTimeZone timeZone = DateTimeZone.forID( "Asia/Macau" );
DateTime now = new DateTime( timeZone );

// Gather inputs
int currentYear = now.getYear();
String givenMonth = "april";
String doubleDigitOne = new java.text.DecimalFormat( "00" ).format( 1 );

// Assemble inputs
String input = currentYear + "-" + givenMonth + "-" + doubleDigitOne;

// Parse inputs.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "yyyy-MMM-dd" ).withLocale( java.util.Locale.ENGLISH ).withZone( timeZone );
DateTime monthStart = formatter.parseDateTime( input );

转储到控制台...

System.out.println( "now: " + now );
System.out.println( "input: " + input );
System.out.println( "monthStart: " + monthStart );
System.out.println( "monthStart in UTC/GMT: " + monthStart.withZone( DateTimeZone.UTC ) );

跑步时......

now: 2014-02-13T21:12:01.901+08:00
input: 2014-april-01
monthStart: 2014-04-01T00:00:00.000+08:00
monthStart in UTC/GMT: 2014-03-31T16:00:00.000Z

这解决了你通过一个月名称的时髦问题。

至于定义代表整月的时间跨度......您可以在StackOverflow上搜索关于该主题的许多已经回答的问题,包括我的几个长解释性问题。搜索以下字词: joda,月初,周开始,半开,包含,独家。提示:间隔是您的新朋友。

答案 3 :(得分:0)

import org.joda.time.format.DateTimeFormat
import org.joda.time.LocalDate

def monthDateRange(month:String) = {
    val ld = LocalDate.parse(month, DateTimeFormat.forPattern("MMMM"))
    val end = ld.plusMonths(1).withDayOfMonth(1).minusDays(1).getDayOfMonth
    (1,end)
}