69

I'm trying to create an application that triggers some code when the financial markets are open. Basically in pseudo code:

if(9:30AM ET < Time.Now < 4:00PM ET) {//do something}

Is there a way I can do this using the DateTime object in C#?

locoboy
  • 36,684
  • 67
  • 180
  • 255

3 Answers3

164

Try this:

var timeUtc = DateTime.UtcNow;
TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime easternTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone);
Abhi
  • 4,754
  • 1
  • 20
  • 20
Dietpixel
  • 9,663
  • 10
  • 27
  • 33
  • 11
    or anyone else, does this also account for `Eastern Daylight Time`? Or do you have to detect if DST is on, and then specify which zone to use? –  Jan 06 '12 at 16:19
  • 4
    small addition: use DateTime.UtcNow this is what was meant with timeUtc – Michael Bahig Feb 07 '13 at 19:48
  • 10
    `Eastern Standard Time` should handle DST properly. See http://stackoverflow.com/questions/964894/how-to-convert-time-between-timezones-utc-to-edt – csm8118 Jul 23 '13 at 18:51
  • 1
    for the 2nd line, I'd use TimeSpan easternTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, easternZone).TimeOfDay; Then you can easily compare to new TimeSpan(16, 30, 00) etc. : – Guy Dec 11 '14 at 13:52
  • 4
    If you are using dotnet core or monodevelop and are planing to run that code on linux then use `Ameria/New_York` instad of `Eastern Standard TIme`. – Tono Nam Sep 26 '19 at 16:27
  • 3
    @TonoNam `Ameria/New_York` is misspelled (just noting it in case somebody else tries to copy and paste like me). Otherwise, thanks for the comment! – Mark Rucker Apr 03 '20 at 15:18
12

You could probably use the ConvertTime method of the TimeZoneInfo class to convert a given DateTime to the Eastern timezone and do the comparison from there.

var timeToConvert = //whereever you're getting the time from
var est = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var targetTime = TimeZoneInfo.ConvertTime(timeToConvert, est);
Roman
  • 18,451
  • 5
  • 62
  • 83
-9

You need to split up the logic into two;

  • Check if date is more than start date, startTime > now
  • Check if date is less than end date, endTime < now

For a date range the logic should satisfy both (with logical AND, &&).

DateTime startTime = DateTime.Today.AddHours(9).AddMinutes(30);
DateTime endTime = DateTime.Today.AddHours(12+4);
DateTime now = DateTime.Now;
if(startTime > now && endTime < now) {
    // do something
}

If you're in ET timezone it should work fine, but otherwise you need to do some timezone manipulation. Check the other answers.

Spoike
  • 116,468
  • 43
  • 136
  • 157