Repository: synthetichealth/synthea
Issue: manifest.xml timestamp sporadically drops seconds from the timestamp text

### What happened?

On several occasions, I have seen the manifest TS drop the ss (seconds) portion of the timestamp; and example:

`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<dataSetManifest xmlns="http://cms.hhs.gov/bluebutton/api/schema/ccw-rif/v9" timestamp="2022-09-26T18:45Z" sequenceId="0" syntheticData="true">
  <entry name="beneficiary_2012.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2013.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2014.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2015.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2016.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2017.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2018.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2019.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2020.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2021.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_2022.csv" type="BENEFICIARY"/>
  <entry name="beneficiary_history.csv" type="BENEFICIARY_HISTORY"/>
  <entry name="carrier.csv" type="CARRIER"/>
  <entry name="dme.csv" type="DME"/>
  <entry name="hha.csv" type="HHA"/>
  <entry name="hospice.csv" type="HOSPICE"/>
  <entry name="inpatient.csv" type="INPATIENT"/>
  <entry name="outpatient.csv" type="OUTPATIENT"/>
  <entry name="pde.csv" type="PDE"/>
  <entry name="snf.csv" type="SNF"/>
</dataSetManifest>`
`
This affects the ETL load as the S3 bucket/folders are inconsistently named. The code in question is:

BB2RIFExporter.java:
`
    manifest.write(String.format(" timestamp=\\"%s\\" ",
             java.time.Instant.now()
                     .atZone(java.time.ZoneId.of("Z"))
                     .truncatedTo(java.time.temporal.ChronoUnit.SECONDS)
                     .toString()));
`
This happens sporadically; am. guessing that maybe the seconds just happened to be zero and they got dropped in the toString() ?

### Environment

```markdown
macOS 12.6

OpenJDK Runtime Environment Temurin-11.0.13+8 (build 11.0.13+8)
OpenJDK 64-Bit Server VM Temurin-11.0.13+8 (build 11.0.13+8, mixed mode)
```


### Relevant log output

_No response_

Changed files:
src/main/java/org/mitre/synthea/export/BB2RIFExporter.java

diff --git a/src/main/java/org/mitre/synthea/export/BB2RIFExporter.java b/src/main/java/org/mitre/synthea/export/BB2RIFExporter.java
index 82efe4448..85884a2e7 100644
--- a/src/main/java/org/mitre/synthea/export/BB2RIFExporter.java
+++ b/src/main/java/org/mitre/synthea/export/BB2RIFExporter.java
@@ -21,6 +21,7 @@ import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -294,6 +295,9 @@ public class BB2RIFExporter {
     rifWriters = new RifWriters(outputDirectory);
   }
 
+  private static DateTimeFormatter MANIFEST_TIMESTAMP_FORMAT
+          = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");
+
   /**
    * Export a manifest file that lists all of the other BFD files (except the NPI file
    * which is special).
@@ -309,7 +313,7 @@ public class BB2RIFExporter {
              java.time.Instant.now()
                      .atZone(java.time.ZoneId.of("Z"))
                      .truncatedTo(java.time.temporal.ChronoUnit.SECONDS)
-                     .toString()));
+                     .format(MANIFEST_TIMESTAMP_FORMAT)));
     manifest.write("sequenceId=\\"0\\" syntheticData=\\"true\\">\\n");
     for (Class<?> rifFile: BB2RIFStructure.RIF_FILES) {
       for (int year: rifWriters.getYears()) {