Узнайте Прошлые 30 Дней, 60 Дней и 90 Дней в Java

1119 Почему бы просто не разобрать их явно? У вас ограниченное количество свойств, так что это не очень сложно. Вместо использования конструктора, требующего много аргументов, я использовал статический метод, который возвращает новый экземпляр DailyValues в качестве возвращаемого типа. Это похоже на DateTime.FromBinary и т. Д.

using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;

namespace CsvDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            List<DailyValues> values = File.ReadAllLines("C:\\Users\\Josh\\Sample.csv")
                                           .Skip(1)
                                           .Select(v => DailyValues.FromCsv(v))
                                           .ToList();
        }
    }

    class DailyValues
    {
        DateTime Date;
        decimal Open;
        decimal High;
        decimal Low;
        decimal Close;
        decimal Volume;
        decimal AdjClose;

        public static DailyValues FromCsv(string csvLine)
        {
            string[] values = csvLine.Split(',');
            DailyValues dailyValues = new DailyValues();
            dailyValues.Date = Convert.ToDateTime(values[0]);
            dailyValues.Open = Convert.ToDecimal(values[1]);
            dailyValues.High = Convert.ToDecimal(values[2]);
            dailyValues.Low = Convert.ToDecimal(values[3]);
            dailyValues.Close = Convert.ToDecimal(values[4]);
            dailyValues.Volume = Convert.ToDecimal(values[5]);
            dailyValues.AdjClose = Convert.ToDecimal(values[6]);
            return dailyValues;
        }
    }
}

Конечно, вы все еще можете добавить конструктор по умолчанию, и вы захотите добавить обработку исключений в случае сбоя анализа (вы также можете использовать TryParse для этого).

  • File.ReadAllLines считывает все строки из файла CSV в массив строк.
  • .Skip(1) пропускает строку заголовка.
  • .Select(v => DailyValues.FromCsv(v)) использует Linq для выбора каждой строки и создания нового экземпляра DailyValues с использованием метода FromCsv. Это создает тип System.Collections.Generic.IEnumerable<CsvDemo.DailyValues>.
  • Наконец, .ToList() обращается к IEnumerable с List, чтобы соответствовать типу, который вы хотите.

Вместо использования Linq вы могли бы просто использовать цикл foreach, чтобы добавить каждый экземпляр DailyValues в свой список.

23
задан scunliffe 28 October 2016 в 13:51
поделиться

3 ответа

Используйте java.util.Calendar .

Date today = new Date();
Calendar cal = new GregorianCalendar();
cal.setTime(today);
cal.add(Calendar.DAY_OF_MONTH, -30);
Date today30 = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, -60);
Date today60 = cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, -90);
Date today90 = cal.getTime();
46
ответ дан 29 November 2019 в 01:12
поделиться

не уверен, откуда вы берете данные, но чтобы вычислить дату то есть через 30 дней вы можете использовать функцию добавления класса Calendar следующим образом:

c.add (Calendar.DAY_OF_MONTH, -30); // предполагая, что c имеет тип java.util.Calendar

Теперь, чтобы выяснить, находится ли конкретная дата между сегодняшним днем ​​и 30 днями назад, вы можете использовать функции before () и after (), чтобы выяснить, была ли дата раньше сегодня, но после 30-го дня до сегодняшнего дня.

1
ответ дан 29 November 2019 в 01:12
поделиться

Честно говоря, я рекомендую вам использовать Joda в качестве библиотеки даты и времени. Он не только имеет превосходный API, но и понимает (т.е. имеет классы для) такие понятия, как периоды, продолжительность и тому подобное.

1
ответ дан 29 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

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