添加30天(mm / dd / yy)

时间:2011-05-08 22:39:27

标签: javascript date

我的日期格式为mm/dd/yy,并且想要添加30天。我只是好奇最好的方法吗?我是javascript的新手,所以示例会有所帮助。

EDITED

抱歉,我使用的是美国日期格式mm/dd/yy

4 个答案:

答案 0 :(得分:38)

更新答案(2018)

向日期字符串添加30天的一种方法是将其解析为日期,添加30天,然后将其格式化为字符串。

应使用定制函数或库手动解析日期字符串。无论哪种方式,您都需要知道格式是否已正确解析,例如

// Given a string in m/d/y format, return a Date
function parseMDY(s) {
  var b = s.split(/\D/);
  return new Date(b[2], b[0]-1, b[1]);
}

// Given a Date, return a string in m/d/y format
function formatMDY(d) {
  function z(n){return (n<10?'0':'')+n}
  if (isNaN(+d)) return d.toString();
  return z(d.getMonth()+1) + '/' + z(d.getDate()) + '/' + d.getFullYear();
}

// Given a string in m/d/y format, return a string in the same format with n days added
function addDays(s, days) {
  var d = parseMDY(s);
  d.setDate(d.getDate() + Number(days));
  return formatMDY(d);
}

[['6/30/2018', 30],
 ['1/30/2018', 30], // Goes from 30 Jan to 1 Mar
 ['12/31/2019', 30]].forEach(a => {
  console.log(`${a[0]} => ${addDays(...a)}`);
});

如果“30天”标准被解释为添加一个月,那就有点棘手了。 1月31日增加1个月将于2月31日到3月2日或3日,具体取决于该年2月是28天还是29天。解决这个问题的一种算法是查看月份是否已经过远并将日期设置为上个月的最后一天,因此2018-01-31加上一个月给出了2018-02-28。

相同的算法可用于减去月数,例如

/**
 * @param {Date} date - date to add months to
 * @param {number} months - months to add
 * @returns {Date}
*/
function addMonths(date, months) {

  // Deal with invalid Date
  if (isNaN(+date)) return;
  
  months = parseInt(months);

  // Deal with months not being a number
  if (isNaN(months)) return;

  // Store date's current month
  var m = date.getMonth();
  date.setMonth(date.getMonth() + months);
  
  // Check new month, if rolled over an extra month, 
  // go back to last day of previous month
  if (date.getMonth() != (m + 12 + months)%12) {
    date.setDate(0);
  }
  
  // date is modified in place, but return for convenience
  return date;
}

// Helper to format the date as D-MMM-YYYY
// using browser default language
function formatDMMMY(date) {
  var month = date.toLocaleString(undefined,{month:'short'});
  return date.getDate() + '-' + month + '-' + date.getFullYear();
}

// Some tests
[[new Date(2018,0,31),  1],
 [new Date(2017,11,31), 2],
 [new Date(2018,2,31), -1],
 [new Date(2018,6,31), -1],
 [new Date(2018,6,31), -17]].forEach(a => {
   let f = formatDMMMY;
   console.log(`${f(a[0])} plus ${a[1]} months: ${f(addMonths(...a))}`); 
});

当然,库可以帮助解决上述问题,算法是相同的。

原始答案(现在非常过时)

只需在今天的日期添加30天:

var now = new Date();
now.setDate(now.getDate() + 30);

但是,你真的想做什么?或者你想今天加一个月?

您可以使用以下方法将日/月份日期转换为日期对象:

var dString = '9/5/2011';
var dParts = dString.split('/');
var in30Days = new Date(dParts[2] + '/' +
                        dParts[1] + '/' +
                        (+dParts[0] + 30)
               );

对于美国日期格式,交换零件0和1:

var in30Days = new Date(dParts[2] + '/' +
                        dParts[0] + '/' +
                        (+dParts[1] + 30)
               );

但是在将日期转换为函数之前最好将日期转换为ISO8601格式,你真的不应该在同一个函数中混合日期解析和算术。综合日期解析功能很复杂(不过分,但它们冗长乏味且需要大量测试),一旦有了日期对象,算法就非常简单。

答案 1 :(得分:14)

完成任务的一种简单方法是在`构造函数中发送时间戳值。计算以时间戳衡量的30天:

\

然后,您需要当前时间戳:

Date

最后,将两个值相加并将结果作为参数发送到构造函数中:

30 * 24 * 60 * 60 * 1000

答案 2 :(得分:0)

尝试

new Date(+yourDate - 30 *86400000)

var yourDate = new Date() 
var newDate = new Date(+yourDate - 30 *86400000)

console.log(newDate)

答案 3 :(得分:0)

回答

一些Javascript命令在React中不可用,例如getDate()。另外,我发现将日期更改为Unix时间戳更好,因此我可以使用比搜索大的简单数学函数在数据库搜索中更轻松地比较日期。

struct ProjectDetailView: View {
    
    @ObservedObject var viewModel = DetailViewModel(db: Project())
    
    var body: some View {
        VStack{
            Form{
                ImageView(image: viewModel.image, systemImageName: "photo", systemImageSize: 50, height: 250, circle: false )
                
                Section{
                    Text(viewModel.number)
                    Text(viewModel.status)
                }
                
                Section {
                    Text(viewModel.company)
                }
                
                Section(header: Text("Addresse")) {
                    HStack{
                        VStack(alignment: .leading){
                            Text(viewModel.street)
                            Text(viewModel.city)
                        }
                        
                    }
                }
            }
        }
            
        .navigationBarTitle(Text("\(viewModel.projectname)"), displayMode: .inline)
    }
}

我可以将其与今天进行比较:

const nowPlus30Days = new Date(Date.now() + (30 * 24 * 60 * 60 * 1000)).getTime() / 1000; 
(1597829050.184)