我的API允许库客户端传递日期:
method(java.util.Date date)
Run Code Online (Sandbox Code Playgroud)
与Joda-Time合作,从这一天开始,我想提取月份并迭代本月所有日子.
现在,传递的日期通常是新的Date() - 意味着当前的瞬间.我的问题实际上是将新的DateMidnight(jdkDate)实例设置为月初.
有人可以用Joda-Time演示这个用例吗?
DateTime - JDK Calendar
DateMidnight的不可变替换 - 表示时间强制为午夜的不可变类
LocalDateTime - 表示本地日期和时间的不可变类(无时区)
我想知道你是如何在分层应用程序中使用这些类的.
我看到几乎所有接口都使用LocalDateTime(至少在服务层)的优势,这样我的应用程序就不必管理时区,并且可以安全地假设时间始终为UTC.然后,我的应用程序可以在执行流程的最开始使用DateTime来管理时区.
我也想知道DateMidnight在哪种情况下有用.
我正在处理与此处提出的问题非常类似的事情 - 比较Joda-Time时区,但它似乎对我不起作用.
这是我正在测试Joda-Time DateTime的一段代码-
DateTime estDT = new DateTime(DateTimeZone.forID("America/Puerto_Rico")).withMillisOfSecond(0);
DateTime londonDT = new DateTime(DateTimeZone.forID("Europe/London")).withMillisOfSecond(0);
System.out.println("Comparison " + londonDT.isBefore(estDT));
System.out.println("Comparison " + londonDT.isAfter(estDT));
Run Code Online (Sandbox Code Playgroud)
有趣的是,我从上面的两个sysout语句中得到'false'.任何人都可以解释一下这种比较的正确方法是什么?
这很奇怪,但我没有找到任何关于将Joda(时间)转换DateTime为Unix DateTime(或时间戳,无论哪个名称正确)的结果.我怎样才能做到这一点?
我想解析一个使用特定时区创建的日期,将其转换为格式并返回.转换有效,但时区偏移始终设置为+0000,并根据需要添加/减去时差.如何使其格式化并保持偏移正确?
我期待这个:2012-11-30T12:08:56.23 + 07:00
但得到这个:2012-11-30T05:08:56.23 + 00:00
执行:
public static final String ISO_8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSZZ";
public static String formatDateToISO8601Standard(Date date) {
DateTime dateTime = new DateTime(date);
DateTimeFormatter df = DateTimeFormat.forPattern(ISO_8601_DATE_FORMAT);
return dateTime.toString(df);
}
Run Code Online (Sandbox Code Playgroud)
测试类:
private static final String DATE_WITH_TIMEZONE = "30 11 2012 12:08:56.235 +0700";
private static final String EXPECTED_DATE_WITH_TIMEZONE = "2012-11-30T12:08:56.23+07:00";
@Test public void testFormattingDateWithSpecificTimezone() throws Exception {
String result = JodaDateUtil.formatDateToISO8601Standard(createDate(DATE_WITH_TIMEZONE));
assertEquals("The date was not converted correctly", EXPECTED_DATE_WITH_TIMEZONE, result); }
private Date createDate(String dateToParse) throws ParseException {
DateTimeFormatter …Run Code Online (Sandbox Code Playgroud) 我想在Joda-Time设置小时,分钟和秒.但是,当我设定它不改变财产.
这是我的代码:
import org.joda.time.DateTime;
public class JodaAkbar
{
public static void main(String args[])
{
DateTime dt = new DateTime();
System.out.println("Before:"+dt);
dt.hourOfDay().setCopy(5);
dt.minuteOfDay().setCopy(20);
dt.secondOfDay().setCopy(0);
System.out.println("After:"+dt);
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出.
Before:2015-04-01T11:01:38.277+11:00
After:2015-04-01T11:01:38.277+11:00
Run Code Online (Sandbox Code Playgroud)
我得到了相同的输出.这里发生了什么错?
编辑:
基本上,我想做类似的事情,如下面的代码所示.由于以下代码在24小时格式下无法正常工作,我切换到了Joda-Time.
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR, 13);
cal.set(Calendar.MINUTE, 25);
cal.set(Calendar.SECOND, 0);
Run Code Online (Sandbox Code Playgroud) 尝试将Unix timstamp从数据库转换为日期格式的String时.
int _startTS = evtResult.getInt("start"); //outputs 1345867200
Long _sLong = new Long(_startTS); //outputs 1345867200
//I've also tried: Long _sLong = new Long(_startTS*1000); //outputs 1542436352
DateTime _startDate = new DateTime(_sLong); //outputs 1970-01-16T08:51:07.200-05:00
Run Code Online (Sandbox Code Playgroud)
时间戳是:Sat, 25 Aug 2012.我不知道为什么1970年总是输出,所以希望有人可以看到我正在犯的一个愚蠢的错误.
我正在寻找一个计算两个日期之间的月份的解决方案.我认为joda或java8时间可以做到.但是当我比较它们时,我发现了一些非常奇怪的东西.
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import org.joda.time.Months;
public class DateMain {
public static void main(String[] args) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Date d1 = simpleDateFormat.parse("2017-01-28 00:00:00.000");
Date d2 = simpleDateFormat.parse("2017-02-28 00:00:00.000");
System.out.println("Test Cast 1");
System.out.println("joda time api result: " + monthsBetweenJoda(d1, d2) + " month");
System.out.println("java8 time api result: " + monthsBetweenJava8(d1, d2) + " month");
Date dd1 = simpleDateFormat.parse("2017-01-29 00:00:00.000");
Date dd2 = simpleDateFormat.parse("2017-02-28 00:00:00.000");
System.out.println("Test Cast …Run Code Online (Sandbox Code Playgroud) 我得到了答案:这很简单.
DateTimeFormatter fmt = DateTimeFormat.forPattern("MM/dd/yyyy");
String formattedDate = jodeLocalDateObj.toString( fmt );
Run Code Online (Sandbox Code Playgroud)