Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从日期中删除日期名称并将其设置为仅';yyyy-MM-dd HH:MM:ss';_Java_Date_Datetime_Simpledateformat_Date Formatting - Fatal编程技术网

Java 从日期中删除日期名称并将其设置为仅';yyyy-MM-dd HH:MM:ss';

Java 从日期中删除日期名称并将其设置为仅';yyyy-MM-dd HH:MM:ss';,java,date,datetime,simpledateformat,date-formatting,Java,Date,Datetime,Simpledateformat,Date Formatting,我试图以yyyy-MM-dd HH:MM:ss格式获取当天上午6点的日期,但显示为:Wed Dec 20 06:00:00 CST 2017 这是我的代码: DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00"); Date date0 = new Date(); String x = dateFormat.format(date0); try{ D

我试图以yyyy-MM-dd HH:MM:ss格式获取当天上午6点的日期,但显示为:Wed Dec 20 06:00:00 CST 2017

这是我的代码:

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
    Date date0 = new Date();
    String x = dateFormat.format(date0);         

    try{
        DateFormat formatter ; 
        Date date ; 
        formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        date = formatter.parse(x);

    }
    catch (Exception e){}

java.util.Date
是Unix时代以来毫秒数的容器,它不维护任何类型的内部格式概念,而是在打印时使用
Date#toString
,它通常使用当前的
Locale
提供值的可读表示

虽然我相信您可以继续使用
Date
来实现这一点,但更简单的方法是利用较新的日期/时间API,比如

LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.withHour(6).withMinute(0).withSecond(0).withNano(0);
String formatted = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(then);
System.out.println(formatted);

对我来说,它打印出的
2017-12-21 06:00:00
java.util.Date
是一个容器,用于存储Unix时代以来的毫秒数,它不维护任何内部格式概念,而是在打印时,它使用
Date#toString
,通常使用当前的
Locale
来提供值的可读表示

虽然我相信您可以继续使用
Date
来实现这一点,但更简单的方法是利用较新的日期/时间API,比如

LocalDateTime now = LocalDateTime.now();
LocalDateTime then = now.withHour(6).withMinute(0).withSecond(0).withNano(0);
String formatted = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(then);
System.out.println(formatted);

对我来说,它会打印出
2017-12-21 06:00:00

解析后,您需要将其格式化如下:
formatter.format(date)
。因此,请按如下方式修改您的代码:

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
    Date date0 = new Date();
    String x = dateFormat.format(date0);         

    try{
              DateFormat formatter ; 
              Date date ; 
              formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              date = formatter.format(formatter.parse(x));

   }
   catch (Exception e){}

解析后,您需要按如下方式格式化:
formatter.format(date)
。因此,请按如下方式修改您的代码:

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd 06:00:00");
    Date date0 = new Date();
    String x = dateFormat.format(date0);         

    try{
              DateFormat formatter ; 
              Date date ; 
              formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
              date = formatter.format(formatter.parse(x));

   }
   catch (Exception e){}
TL;博士 正在运行这个打印的

2017-12-21 06:00:00
细节 您使用的类,
Date
SimpleDateFormat
,从Java1.0开始已经存在了大约20年。事实证明,它们设计拙劣,使用繁琐。也许也是出于这个原因,关于它们的文章已经很多了,通过搜索web,你很容易就会得到这样的印象:这些是你应该使用的类。相反,它们是你应该避免的课程。他们的替代品是Java8,这将是4年前的事了

格式化程序用于格式化和解析。您不应该使用一个格式化程序,更不用说两个格式化程序,将一天的时间更改为上午6点

世界各地的日子都不一样。因此,获取今天的日期是一项取决于时区的操作。我已经在代码中明确了时区,因此读者也会意识到这一点。如果不是美国/温尼伯,请替换您想要的时区

您正在修改现有软件。如果从中获得了老式的
Date
对象,请首先将其转换为现代的
Instant
类型,然后使用现代API进行进一步的操作。例如:

    Date date0 = getOldfashionedDateFromLegacyApi();
    String at6Am = date0.toInstant()
            .atZone(ZoneId.of("America/Winnipeg"))
            .with(LocalTime.of(6, 0))
            .format(formatter);
你的代码出了什么问题? 我认为你的问题中的代码没有任何问题。您希望您的日期时间格式为2017-12-20 06:00:00,并且您在第三行代码的字符串
x
中得到了该格式。对此感到满意,并省略代码的其余部分

不存在将格式强加给日期时间对象的情况(无论我们谈论的是过时的还是现代的API)。格式化日期时间意味着将其转换为所需格式的
字符串。

TL;博士 正在运行这个打印的

2017-12-21 06:00:00
细节 您使用的类,
Date
SimpleDateFormat
,从Java1.0开始已经存在了大约20年。事实证明,它们设计拙劣,使用繁琐。也许也是出于这个原因,关于它们的文章已经很多了,通过搜索web,你很容易就会得到这样的印象:这些是你应该使用的类。相反,它们是你应该避免的课程。他们的替代品是Java8,这将是4年前的事了

格式化程序用于格式化和解析。您不应该使用一个格式化程序,更不用说两个格式化程序,将一天的时间更改为上午6点

世界各地的日子都不一样。因此,获取今天的日期是一项取决于时区的操作。我已经在代码中明确了时区,因此读者也会意识到这一点。如果不是美国/温尼伯,请替换您想要的时区

您正在修改现有软件。如果从中获得了老式的
Date
对象,请首先将其转换为现代的
Instant
类型,然后使用现代API进行进一步的操作。例如:

    Date date0 = getOldfashionedDateFromLegacyApi();
    String at6Am = date0.toInstant()
            .atZone(ZoneId.of("America/Winnipeg"))
            .with(LocalTime.of(6, 0))
            .format(formatter);
你的代码出了什么问题? 我认为你的问题中的代码没有任何问题。您希望您的日期时间格式为2017-12-20 06:00:00,并且您在第三行代码的字符串
x
中得到了该格式。对此感到满意,并省略代码的其余部分


不存在将格式强加给日期时间对象的情况(无论我们谈论的是过时的还是现代的API)。格式化日期时间意味着将其转换为所需格式的
字符串。

date
没有“格式”的内部概念,当您使用
date#toString
时,它倾向于使用当前区域设置的格式,因此,您需要重新格式化结果。在这种情况下,您最好使用新的日期/时间API,通过hadd e.printStackTrace()设置时间会更简单;抓住并告诉我们答案error@StringForever我理解OP的问题,它没有抛出任何异常。格式本身工作正常,但OP希望使用与结果格式不同的格式。这只是与实际问题无关的错误做法。添加Locale.getDefault()以获取区域设置时间:-DateFormat DateFormat=new SimpleDateFormat(“yyy-MM-dd HH:MM:ss”,Locale.getDefault());String time=dateFormat.format(new Date());是