You have used the wrong ordinal for the argument. It should be %5
instead of %1
because new Date()
is the 5th argument.
import java.util.Date;
public class Main {
public static void main(String[] args) {
String exampleFourText = """
<html>
<body>
<p> %s </p>
<p> %.1f </p>
<p> %d </p>
<p> %c </p>
<p> %5$tY-%5$tm-%5$td </p>
</body>
</html>
""";
exampleFourText = exampleFourText.formatted("Hello", 1234.6, 15, 'y', new Date());
System.out.println(exampleFourText);
}
}
Output:
<html>
<body>
<p> Hello </p>
<p> 1234.6 </p>
<p> 15 </p>
<p> y </p>
<p> 2021-03-17 </p>
</body>
</html>
However, the idiomatic way to do it is by using SimpleDateFormat
as shown below:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String exampleFourText = """
<html>
<body>
<p> %s </p>
<p> %.1f </p>
<p> %d </p>
<p> %c </p>
<p> %s </p>
</body>
</html>
""";
exampleFourText = exampleFourText.formatted("Hello", 1234.6, 15, 'y',
new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).format(new Date()));
System.out.println(exampleFourText);
}
}
Output:
<html>
<body>
<p> Hello </p>
<p> 1234.6 </p>
<p> 15 </p>
<p> y </p>
<p> 2021-03-17 </p>
</body>
</html>
Note that the java.util
date-time API and their formatting API, SimpleDateFormat
are outdated and error-prone. It is recommended to stop using them completely and switch to the modern date-time API*.
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
String exampleFourText = """
<html>
<body>
<p> %s </p>
<p> %.1f </p>
<p> %d </p>
<p> %c </p>
<p> %5$tY-%5$tm-%5$td </p>
</body>
</html>
""";
exampleFourText = exampleFourText.formatted("Hello", 1234.6, 15, 'y', LocalDate.now());
System.out.println(exampleFourText);
}
}
Output:
<html>
<body>
<p> Hello </p>
<p> 1234.6 </p>
<p> 15 </p>
<p> y </p>
<p> 2021-03-17 </p>
</body>
</html>
As mentioned earlier, the idiomatic way to do it is by using a date-time formatter type which is DateTimeFormatter
for the modern date-time API. However, since your desired format is also the default format of LocalDate#toString
, you do not need DateTimeFormatter
for this format. Just for the sake of completeness, I have also shown the use of DateTimeFormatter
in the following code.
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String exampleFourText = """
<html>
<body>
<p> %s </p>
<p> %.1f </p>
<p> %d </p>
<p> %c </p>
<p> %s </p>
</body>
</html>
""";
exampleFourText = exampleFourText.formatted("Hello", 1234.6, 15, 'y', LocalDate.now());
System.out.println(exampleFourText);
exampleFourText = exampleFourText.formatted("Hello", 1234.6, 15, 'y',
LocalDate.now().format(DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.ENGLISH)));
System.out.println(exampleFourText);
}
}
Output:
<html>
<body>
<p> Hello </p>
<p> 1234.6 </p>
<p> 15 </p>
<p> y </p>
<p> 2021-03-17 </p>
</body>
</html>
<html>
<body>
<p> Hello </p>
<p> 1234.6 </p>
<p> 15 </p>
<p> y </p>
<p> 2021-03-17 </p>
</body>
</html>
Learn more about the modern date-time API from Trail: Date Time.
* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.