鉴于当前年份和完整字符串格式(“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有一个标准的方法,我决定不这样做。
我该怎么做?
答案 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,因此在设置monthStart
和monthEnd
时我明确将其设置为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)
}