Что лучший способ состоит в том, чтобы проанализировать дату в формате MM/DD/YY и скорректировать его к току / в предыдущем веке?

Я не использовал aws-sdk-mock, но, видимо, в вашем макете вы используете обратный вызов, а в лямбда-обработчике это асинхронный вызов. Я использую proxyquire для пересмешивания зависимостей. Вот пример:

functionHandler.js

Не нужно использовать callback и context во время выполнения лямбды Node8.10.

let AWSSQS = require('aws-sdk/clients/sqs');
let sqs = new AWSSQS();

exports.functionHandler = async (event) => {

  // No need to use callback when Lambda runtime is 8.10.
  try {

    let parsedBody = JSON.parse(event.Records[0].body);
    let modifiedBody = await doStuff(parsedBody);

    let sqsPayload = {
      MessageBody: JSON.stringify(modifiedBody),
      QueueUrl: my-queue-url
    };

    await sqs.sendMessage(sqsPayload).promise();

    return utils.respondSuccess('Done');
  } catch (err) {
    throw utils.respondError(err);
  }
};

test.spec.js

В значительной степени говорят сами за себя. Вы определяете объект с именем зависимости как свойство.

const proxyquire = require('proxyquire');

let app = require('path/to/function');

describe('SQS', () => {

  it("an awesome title for my test", async (done) => {

    const app = proxyquire(app, {
      'aws-sdk/clients/sqs': function() {
        this.sendMessage = (params) => {
          return {
            promise: () => {
              return Promise.resolve({
                ResponseMetadata: {
                  RequestId: 'test-request-id'
                },
                MD5OfMessageBody: 'a892e8d8589e97ca92fb70020f01c16c',
                MessageId: 'test-message-id'
              });
            }
          }
        }
      }
    });

    let payload = {
      Records: [
        // Data here
      ]
    };

    const data = await app.functionHandler(payload);
    let parsedBody = JSON.parse(data.body);
    expect(parsedBody.message).to.be.equal("Done");
    done();
  });
});

10
задан ScArcher2 30 October 2008 в 19:57
поделиться

5 ответов

Сценарий Groovy (достаточно легкий бросить в Java) демонстрация точки @bobince сделанный о SimpleDateFormat.

import java.text.SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat('MM/dd/yy')
SimpleDateFormat fmt = new SimpleDateFormat('yyyy-MM-dd')

Calendar cal = Calendar.getInstance()
cal.add(Calendar.YEAR, -100)
sdf.set2DigitYearStart(cal.getTime())

dates = ['01/01/01', '10/30/08','01/01/09']
dates.each {String d ->
  println fmt.format(sdf.parse(d))
}

Урожаи

2001-01-01
2008-10-30
1909-01-01
10
ответ дан 3 December 2019 в 14:54
поделиться

SimpleDateFormat уже делает двухразрядный год, анализируя для Вас, с помощью двухбуквенного ‘yy’ формата. (Это все еще позволит четыре цифры, очевидно.)

По умолчанию это использует now-80→now+20, таким образом, это не точно то же правило, Вы делаете предложение, но это разумно и стандартизировано (в мире Java, по крайней мере) и может быть переопределено с помощью set2DigitYearStart (), если Вы хотите.

DateFormat informat= new SimpleDateFormat("MM/dd/yy");
DateFormat outformat= new SimpleDateFormat("MM/dd/yyyy");
return outformat.format(informat.parse(dateString));

В долгосрочной перспективе попытайтесь мигрировать на дату ISO8601, форматирующую (yyyy-MM-dd), потому что MM/dd/yy является приблизительно худшим форматом даты и обязан вызвать проблемы в конечном счете.

9
ответ дан 3 December 2019 в 14:54
поделиться

Лучший способ состоит в том, чтобы использовать Время Joda API для дат и времени в Java.

-1
ответ дан 3 December 2019 в 14:54
поделиться

Как насчет этого:

public static String anEasierStupidDateWithNoStringParsing(String dateString) {
    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");

    //handling ParseExceptions is an exercise left to the reader!
    Date date = df.parse(dateString);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);

    Calendar now = Calendar.getInstance();
    if (cal.after(now)) {
        cal.add(Calendar.YEAR, -100);
    }

    return cal;
}

Другими словами, позвольте SimpleDateFormat проанализировать Строку и просто скорректировать год, чтобы быть в предыдущем веке, если SimpleDateFormat (который имеет свои собственные правила для интерпретации строк года) возвращает дату, которая является после текущей даты.

Это гарантировало бы, что все возвращенные даты находятся в прошлом. Однако это не составляет дат, которые могли бы быть проанализированы как перед этим в прошлом веке - например, с форматом MM/dd/yyyy, строка даты как "01/11/12" анализирует к Jan 11, 12 нашей эры.

8
ответ дан 3 December 2019 в 14:54
поделиться

Если Время Joda является опцией:

String inputDate = "01/01/08";
// assuming U.S. style date, since it's not clear from your original question
DateTimeFormatter parser = DateTimeFormat.forPattern("MM/dd/yy");
DateTime dateTime = parser.parseDateTime(inputDate);
// if after current time
if (dateTime.isAfter(new DateTime())) {
    dateTime = dateTime.minus(Years.ONE);
}

return dateTime.toString("MM/dd/yyyy");

Я знаю, что Время Joda не является частью Java SE, и как я сказал в другом потоке, я обычно не потворствую пользованию сторонней библиотекой, когда существует библиотека Java, которая делает то же самое. Однако человек, который разрабатывает Время Joda, также ведет JSR310 - Дата и время API, это превратит его в Java 7. Так я Время Joda в основном будет в будущих выпусках Java.

5
ответ дан 3 December 2019 в 14:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: